我有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的简单循环,因此我认为应该有一些有效的方法来实现自己的目标。
谢谢!
答案 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