首页 > 解决方案 > 数据帧中逻辑值的逐行总和

问题描述

我有一个这样的数据框(有更多变量)

tb = data.frame(ID=c("a","b","c"),V1=c(TRUE,FALSE,TRUE),
                V2=c(FALSE,FALSE,TRUE),V3=c(TRUE,TRUE,FALSE) )
tb 

  ID    V1    V2    V3
1  a  TRUE FALSE  TRUE
2  b FALSE FALSE  TRUE
3  c  TRUE  TRUE FALSE

我需要像这样按行添加第四个变量和真实值的总和,但保留所有其他变量

tb %>%
 select(V1:V3) %>%
 mutate(out = rowSums(.))

     V1    V2    V3 out
1  TRUE FALSE  TRUE   2
2 FALSE FALSE  TRUE   1
3  TRUE  TRUE FALSE   2

标签: rdplyr

解决方案


dplyr 解决方案

在单个调用中,您可以使用where内部的选择助手across仅将满足条件 ( is.logical) 的列提供给rowSums.

tb %>% mutate(sum = rowSums(across(where(is.logical))))

  ID    V1    V2    V3 sum
1  a  TRUE FALSE  TRUE   2
2  b FALSE FALSE  TRUE   1
3  c  TRUE  TRUE FALSE   2

您还可以在内部按名称选择列,或者使用带有starts_with或的名称模式选择列matches

tb %>% mutate(sum = rowSums(across(V1:V3)))
#OR
tb %>% mutate(sum = rowSums(across(starts_with("V"))))
#OR
tb %>% mutate(sum = rowSums(across(matches("V\\d"))))

推荐阅读