R:循环中的if语句

时间:2015-12-01 10:55:25

标签: r loops if-statement matrix

基本上是对this问题的跟进。

我仍然试图抓住R的矢量化,同时试图加快同事的速度。'码。我已阅读R infernoSpeed 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

1 个答案:

答案 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列,您需要大量内存。

相关问题