如何统计DataFrame每行中指定值的出现次数?
在R的DataFrame中新增列统计每行特定值的出现次数
方法1:使用base R的rowSums(推荐,高效)
这是最简洁且性能最优的方式,利用向量化操作直接计算每行中等于目标值的元素个数:
# 补全初始数据(原代码缺失id列定义) id <- 1:6 X1 <- c(5,1,7,8,1,5) X2 <- c(5,0,0,2,3,7) X3 <- c(6,2,3,4,1,7) X4 <- c(1,1,5,2,1,7) df <- data.frame(id,X1,X2,X3,X4) # 新增统计列,统计X1-X4列中值为1的次数 df$one_appears <- rowSums(df[, c("X1", "X2", "X3", "X4")] == 1)
执行后即可得到期望结果:
> df id X1 X2 X3 X4 one_appears 1 1 5 5 6 1 2 2 2 1 0 1 1 3 3 3 7 0 3 5 0 4 4 8 2 4 2 0 5 5 1 3 2 1 2 6 6 5 7 7 7 0
方法2:使用base R的apply函数
如果需要逐行处理逻辑,可以用apply逐行遍历指定列并统计:
# 排除id列(第1列),对剩余列逐行统计值为1的个数 df$one_appears <- apply(df[, -1], 1, function(row) sum(row == 1))
注:apply是逐行循环操作,当数据量较大时,性能不如rowSums。
方法3:使用dplyr包(tidyverse风格)
如果你习惯使用tidyverse工具链,可用以下两种方式:
方式A:rowwise + c_across
适合逐行处理复杂逻辑的场景:
library(dplyr) df <- df %>% rowwise() %>% mutate(one_appears = sum(c_across(X1:X4) == 1)) %>% ungroup() # 取消逐行分组状态
方式B:mutate + rowSums(更高效)
结合向量化操作,性能接近base R的rowSums:
library(dplyr) df <- df %>% mutate(one_appears = rowSums(across(X1:X4) == 1))
内容的提问来源于stack exchange,提问作者user21027866
相关产品推荐
相关产品推荐

