我有以下矩阵,操作结果为A,B,C,D,E
Name result freq
A ok 3
A nok 4
B ok 5
B nok 6
C ok 7
D nok 8
E ok 8
E nok 9
我需要创建一个具有以下格式的新表:
Name freok Frenok
A 3 4
B 5 6
C 7 0
D 0 8
E 8 9
为每个操作计算好的和坏的结果,如果第一个矩阵中缺少操作的ok或notok,那么我需要在处理的矩阵中放置一个Zero。
我需要处理大约1600万行的矩阵
什么是最快的解决方案?
答案 0 :(得分:4)
我们可以使用xtabs
base R
执行此操作
xtabs(freq~Name+result, df1)
# result
#Name nok ok
# A 4 3
# B 6 5
# C 0 7
# D 8 0
# E 9 8
快速有效的选项是来自dcast
data.table
library(data.table)
dcast(as.data.table(df1), Name~ paste0("fre", result), value.var="freq", sum)
答案 1 :(得分:3)
使用tidyr
(R中tidyverse的一部分并使用dplyr
)
# your data example
df <- structure(
list(
Name = c("A", "A", "B", "B", "C", "D", "E", "E"),
result = c("ok", "nok", "ok", "nok", "ok", "nok", "ok", "nok"),
freq = c(3L, 4L, 5L, 6L, 7L, 8L, 8L, 9L)
),
class = "data.frame",
row.names = c(NA,-8L),
.Names = c("Name", "result", "freq")
)
df
#> Name result freq
#> 1 A ok 3
#> 2 A nok 4
#> 3 B ok 5
#> 4 B nok 6
#> 5 C ok 7
#> 6 D nok 8
#> 7 E ok 8
#> 8 E nok 9
res <- df %>% tidyr::spread(result, freq, fill = 0)
res
#> Name nok ok
#> 1 A 4 3
#> 2 B 6 5
#> 3 C 0 7
#> 4 D 8 0
#> 5 E 9 8
str(res)
#> 'data.frame': 5 obs. of 3 variables:
#> $ Name: chr "A" "B" "C" "D" ...
#> $ nok : num 4 6 0 8 9
#> $ ok : num 3 5 7 0 8