R:在有条件的变量之间循环

时间:2019-10-25 00:37:11

标签: r

我有x1, x2, ..., x96, y1, y2, ..., y96个带有levels(x1,...,x96) = c(1,2,3,4,5)levels(y1,...,y96) = c(11,12,13,14,15)的类别变量。

大约有200,000个条目,没有NA。

我想遍历所有条目和变量,这样

data[,paste0('z',1:96)] = 0
data$xx = 0
data$yy = 0
for (row in 1:nrow(data)) {
    for (i in 1:96) {
        if (data[row,paste(x,i,sep="")] == 1
          | data[row,paste(x,i,sep="")] == 2
          | data[row,paste(x,i,sep="")] == 5) {
            if (data[row,paste(y,i,sep="")] == 11
              | data[row,paste(y,i,sep="")] == 12) {
                data[row,paste0('z',i)] = 1
            } else {
                data$xx = data$xx + 1
            }
        } else if (data[row,paste(x,i,sep="")] == 3) {    
            if (data[row,paste(y,i,sep="")] == 14
              | data[row,paste(y,i,sep="")] == 15) {
                data$xx = data$xx + 1
            } else {
                data$yy = data$yy + 1
            } 
        }
    }
}

现在,它可以成功运行并为我提供正确的输出,但是要花费更多的时间,如果添加语句,它会花费很长的时间...

由于这只是一串ifelse的简单循环,因此我认为应该有一些有效的方法来实现自己的目标。

谢谢!

1 个答案:

答案 0 :(得分:1)

未经测试,没有示例数据或预期输出,但这是我的最佳猜测。肯定会更快,因为所有行操作都是矢量化的。

inds = 1:96
xs = paste0(x, inds)
ys = paste0(y, inds)
zs = paste0(z, inds)

xx = 0
yy = 0
data[, zs] = 0

for(i in seq_along(inds)) {
  condition_1a = data[, xs[i]] %in% c(1, 2, 5)
  conditoin_1b = data[, ys[i]] %in% c(11, 12)
  data[condition_1a & condition_1b, zs[i]] = 1  
  xx = xx + sum(condition1a & !condition_1b)

  condition_2a = data[, xs[i]] %in% c(3)
  condition_2b = data[, ys[i]] %in% c(14, 15)
  xx = xx + sum(condition_2a & condition_2b)
  yy = yy + sum(condition_2a & !condition_2b)
}

data$xx = xx
data$yy = yy