我想使用data.table进行简单的循环。我有20个二分(0,1)变量(从var_1到var_20),我想为此做一个循环:
dat[var_1==1, newvar:=1]
dat[var_2==1, newvar:=2]
dat[var_3==1, newvar:=3]
...
dat[var_20==1, newvar:=21]
我的主要问题是我不知道如何使用循环指定i(即var_1 == 1,var_2 == 2 ...)。 下面是一个简短的例子:
var_1 <- c(1, rep(0,9))
var_2 <- c(0,1, rep(0,8))
var_3 <- c(0,0,1, rep(0,7))
dat <- data.table(var_1, var_2, var_3)
dat[var_1==1, newvar:=1]
dat[var_2==1, newvar:=2]
dat[var_3==1, newvar:=3]
有关如何使用循环执行此操作的任何想法? 谢谢!
答案 0 :(得分:4)
这样的事情会起作用。
nams <- names(dat)
for(n in seq_along(nams)){
nam <- nams[n]
char <- sprintf('%s==1',nam)
dat[eval(parse(text=char)), newvar := n]
}
dat
var_1 var_2 var_3 newvar
1: 1 0 0 1
2: 0 1 0 2
3: 0 0 1 3
4: 0 0 0 NA
5: 0 0 0 NA
6: 0 0 0 NA
7: 0 0 0 NA
8: 0 0 0 NA
9: 0 0 0 NA
10: 0 0 0 NA
答案 1 :(得分:4)
要利用data.table类,最好设置密钥。
dat[ ,newvar:= NA_integer_]
for(i in ncol(dat)) {
setkeyv(dat, names(dat)[i])
dat[J(1), newvar:=i]
}