[英]Summing Up Columns Based on Multiple IFELSE Statements
我有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條語句中的至少一條的實例。 我的邏輯對分配值和求和是否正確? 還是巧合,沒有一個語句同時出現?
我想這里有很多事情要做。 假設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軟件包 (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軟件包 (v0.3.0)創建於2019-09-17
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.