我想在数据框NewVar
中创建变量A
,如果满足以下两个条件,则将其设置为1。
Var0==
列名Var(i)
中的数字,例如Var0=4
和Var4
!Var(i)==0
下面是我想要实现的示意图:
A <- read.table(text=" Var0 Var1 Var2 Var3 Var4 NewVar
4 0 0 0 1 1
4 0 0 0 0 0
2 0 1 0 0 1
2 0 0 0 0 0
1 1 0 0 0 1
1 0 0 0 0 0
3 0 0 1 0 1
3 0 0 0 0 0", header=T)
我一直在尝试使用类似的东西:
A$NewVar <- for (var in names(A[ ,2:5])) {
ifelse(A$Var0==grep("var", colnames(A)) & A$var==1, 1, 0)
}
访问列索引,但它不起作用。
在Excel中,我将使用match语句返回变量Var1-4中1的列索引,并使用if语句来测试列索引是否等于Var0中的值。如果是,则NewVar = 1,否则为0.
希望这使我想要做的更清楚。我正在尝试从Excel迁移到R!
答案 0 :(得分:0)
以下两种方法假设:
第一个选项是使用for循环,第二个选项是使用apply()
:
A <- read.table(text=" Var0 Var1 Var2 Var3 Var4 NewVar
4 0 0 0 1 1
4 0 0 0 0 0
2 0 1 0 0 1
2 0 0 0 0 0
1 1 0 0 0 1
1 0 0 0 0 0
3 0 0 1 0 1
3 0 0 0 0 0", header=T)
# Using a for loop...
col_to_match <- paste0("Var", A$Var0)
for(i in seq(col_to_match)) {
A[i, "NewVar2"] <- A[i, col_to_match[i]]
}
# Using apply()
A$NewVar3 <- apply(A, 1, function(i) {
col_to_match <- paste0("Var", i["Var0"])
i[col_to_match]
})
A
#> Var0 Var1 Var2 Var3 Var4 NewVar NewVar2 NewVar3
#> 1 4 0 0 0 1 1 1 1
#> 2 4 0 0 0 0 0 0 0
#> 3 2 0 1 0 0 1 1 1
#> 4 2 0 0 0 0 0 0 0
#> 5 1 1 0 0 0 1 1 1
#> 6 1 0 0 0 0 0 0 0
#> 7 3 0 0 1 0 1 1 1
#> 8 3 0 0 0 0 0 0 0
只需改变&#34; NewVar2&#34;或&#34; NewVar3&#34;到&#34; NewVar&#34; (我只是添加了数字来证明)。
如果您确实需要检查值!= 0
,然后将其添加到相关行并添加as.numeric()
以从布尔值获取到0/1。例如,在上面的for循环部分中:
A[i, "NewVar2"] <- as.numeric(A[i, col_to_match[i]] != 0)
或apply()
部分:
as.numeric(i[col_to_match] != 0)