我有20列要基于其他列分配布尔值。我想为数据集中的每一行生成这些值,然后创建一列来汇总这20列中的值。问题是,当我期望至少某些计数大于1时,我为求和列接收的唯一值是1。我的代码如下:
for (i in 1:nrow(test)){
test$var1<-with(test[i],ifelse((varA==1 & varB>10),1,0))
test$var2<-with(test[i],ifelse((varb==1),1,0))
...
test$var20<-with(test[i],ifelse((varx==1 & varB>15),1,0))
test$count<-rowSums(,20:39])
}
我确实对数据集进行了子集处理,以仅包括触发了20条语句中的至少一条的实例。我的逻辑对分配值和求和是否正确?还是巧合,没有一个语句同时出现?
答案 0 :(得分:0)
所以,我认为这里发生了很多事情。假设test
是data.frame
,test[i]
将给您第i个列。向量化是您的朋友,而sum
则将布尔值视为0和1。无需遍历data.frame的行并单独设置每一行,一次执行整个矢量(列)。
set.seed(1234)
test <- data.frame(varA = rbinom(15, 1, .5),
varB = rnorm(15, 12, 3),
varC = rpois(15, 2))
test$var1 <- test$varA == 1 & test$varB > 10
test$var2 <- test$varC == 0
test$var3 <- test$varA == 0 & test$varB < 12
test
#> varA varB varC var1 var2 var3
#> 1 0 14.950211 2 FALSE FALSE FALSE
#> 2 1 10.132630 3 TRUE FALSE FALSE
#> 3 1 9.805392 2 FALSE FALSE FALSE
#> 4 1 10.449991 1 TRUE FALSE FALSE
#> 5 1 6.747800 3 FALSE FALSE FALSE
#> 6 1 14.640312 0 TRUE TRUE FALSE
#> 7 0 16.110031 1 FALSE FALSE FALSE
#> 8 0 6.938019 3 FALSE FALSE TRUE
#> 9 1 10.117691 2 TRUE FALSE FALSE
#> 10 1 12.054950 1 TRUE FALSE FALSE
#> 11 1 14.115730 2 TRUE FALSE FALSE
#> 12 1 10.058943 2 TRUE FALSE FALSE
#> 13 0 14.604543 3 FALSE FALSE FALSE
#> 14 1 13.126907 1 TRUE FALSE FALSE
#> 15 0 12.930787 3 FALSE FALSE FALSE
rowSums(test[,4:6])
#> [1] 0 1 0 1 0 2 0 1 1 1 1 1 0 1 0
由reprex package(v0.3.0)于2019-09-17创建
作者在下面评论说,它是data.table
,解释了test[i]
语法。这是更新的解决方案。
library(data.table)
set.seed(1234)
test <- data.table(varA = rbinom(15, 1, .5),
varB = rnorm(15, 12, 3),
varC = rpois(15, 2))
test[,var1 := test$varA == 1 & test$varB > 10]
test[,var2 := test$varC == 0]
test[,var3 := test$varA == 0 & test$varB < 12]
test
#> varA varB varC var1 var2 var3
#> 1: 0 14.950211 2 FALSE FALSE FALSE
#> 2: 1 10.132630 3 TRUE FALSE FALSE
#> 3: 1 9.805392 2 FALSE FALSE FALSE
#> 4: 1 10.449991 1 TRUE FALSE FALSE
#> 5: 1 6.747800 3 FALSE FALSE FALSE
#> 6: 1 14.640312 0 TRUE TRUE FALSE
#> 7: 0 16.110031 1 FALSE FALSE FALSE
#> 8: 0 6.938019 3 FALSE FALSE TRUE
#> 9: 1 10.117691 2 TRUE FALSE FALSE
#> 10: 1 12.054950 1 TRUE FALSE FALSE
#> 11: 1 14.115730 2 TRUE FALSE FALSE
#> 12: 1 10.058943 2 TRUE FALSE FALSE
#> 13: 0 14.604543 3 FALSE FALSE FALSE
#> 14: 1 13.126907 1 TRUE FALSE FALSE
#> 15: 0 12.930787 3 FALSE FALSE FALSE
rowSums(test[, 4:6, with=FALSE])
#> [1] 0 1 0 1 0 2 0 1 1 1 1 1 0 1 0
由reprex package(v0.3.0)于2019-09-17创建