基本上是对this问题的跟进。
我仍然试图抓住R的矢量化,同时试图加快同事的速度。'码。我已阅读R inferno和Speed up the loop operation in R。
我的目标是加速以下代码,完整的数据集包含〜1000列10.000-1.000.000行:
df3 <- structure(c("X", "X", "X", "X", "O", "O", "O", "O", "O", "O",
"O", "O", "O", "O", "O", "O"), .Dim = c(2L, 8L), .Dimnames = list(
c("1", "2"), c("pig_id", "code", "DSFASD32", "SDFSD56",
"SDFASD12", "SDFSD56342", "SDFASD12231", "SDFASD45442"
)))
score_1 <- structure(c(0, 0, 0, 0, 0, 0), .Dim = 2:3)
for (i in 1:nrow(df3)) {
a<-matrix(table(df3[i,3:ncol(df3)]))
if (nrow(a)==1) {
score_1[i,1]<-0 #count number of X (error), N (not compared) and O (ok)
score_1[i,2]<-a[1,1]
}
if (nrow(a)==2) {
score_1[i,1]<-a[1,1]
score_1[i,2]<-a[2,1]
}
if (nrow(a)==3) {
score_1[i,1]<-a[1,1]
score_1[i,2]<-a[2,1]
score_1[i,3]<-a[3,1]
}
}
colnames(score_1) <- c("N", "O", "X")
我一直在努力,但似乎无法弄明白。 这是我尝试过的。它显示与上面代码相同的输出,但我不确定它是否实际上是相同的。我在R和我的数据集中缺少一点洞察力。
我似乎无法让我的代码获得与for循环相同的输出。
修改 为了回应Heroka的回应,我更新了我可重复的例子:
for循环的输出:
[,1] [,2] [,3]
[1,] 0 6 0
[2,] 0 6 0
应用函数的输出:
1 2
[1,] 6 6
答案 0 :(得分:2)
由于转换为因子(强制其他字母为零),这为您提供了表中所需的结果,但计算效率低于仅使用apply和table。
res <- t(apply(df3[,-c(1:2)],1,function(x){
x_f=factor(x, levels=c("N","O","X"))
return(table(x_f))
}))
> res
N O X
1 0 6 0
2 0 6 0
对于较小的数据集,首先熔化数据可能是一个选项,但是对于1e6行和100列,您需要大量内存。