基于多个IFELSE语句汇总列

时间:2019-09-17 22:34:45

标签: r data.table

我有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条语句中的至少一条的实例。我的逻辑对分配值和求和是否正确?还是巧合,没有一个语句同时出现?

1 个答案:

答案 0 :(得分:0)

所以,我认为这里发生了很多事情。假设testdata.frametest[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创建