如何在R语言DataFrame中按行计算逻辑值总和并保留所有原有变量
解决方案:保留所有变量并计算行内TRUE值总和
你遇到的问题根源在于先使用select(V1:V3)过滤掉了ID列,后续操作只在这个子数据集里进行,所以最终结果丢失了原有变量。下面给你几个简单有效的方法,既能计算每行TRUE的数量,又能完整保留所有原有列:
方法1:直接指定求和列范围(最直观)
不用提前筛选列,而是在mutate里通过select(., V1:V3)精准定位需要求和的列,这样原有列都会被保留:
library(dplyr) tb %>% mutate(out = rowSums(select(., V1:V3)))
运行后得到的结果会包含所有原有变量:
ID V1 V2 V3 out 1 a TRUE FALSE TRUE 2 2 b FALSE FALSE TRUE 1 3 c TRUE TRUE FALSE 2
方法2:按列名规则批量选择(更灵活)
如果你的逻辑列都有统一命名规则(比如都是V开头),可以用starts_with这类辅助函数批量选择,就算以后新增类似列也不用修改代码:
tb %>% mutate(out = rowSums(select(., starts_with("V"))))
方法3:使用rowwise + c_across(适合逐行操作场景)
如果需要更精细化的逐行处理,可以结合rowwise()和c_across,不过这种方法对大数据集的效率略低于前两种:
tb %>% rowwise() %>% mutate(out = sum(c_across(V1:V3))) %>% ungroup()
小提示
逻辑值TRUE在R中会被自动转换为1,FALSE转换为0,所以rowSums直接就能计算每行的TRUE数量,不需要额外转换类型。
内容的提问来源于stack exchange,提问作者Wael




