如何优化R语言中特定列满足条件的行求和代码?
解决方案
方法1:用rowwise() + c_across()实现
直接在单个mutate语句里,通过c_across(v1:v4)获取每行指定范围的列值,判断是否等于"a"后求和,完全不会修改原有列:
library(dplyr) # 示例数据 df <- tibble( v1 = c("a", "b", "a"), v2 = c("b", "a", "a"), v3 = c("a", "c", "b"), v4 = c("d", "a", "a"), other_col = c(1, 2, 3) # 保留的其他列 ) # 生成n_a列,原列丝毫不改 df <- df %>% rowwise() %>% mutate(n_a = sum(c_across(v1:v4) == "a")) %>% ungroup() # 别忘了取消行分组,避免后续操作受影响
方法2:向量化写法(更高效,无需rowwise())
如果数据量较大,逐行处理的rowwise速度偏慢,用rowSums配合across做向量化判断,性能提升明显,同样满足要求:
df <- df %>% mutate(n_a = rowSums(across(v1:v4, ~ .x == "a"), na.rm = TRUE))
关键说明
- 两种方法都仅新增
n_a列,v1-v4及其他原有列完全保持原样 - 均支持
v1:v4这类列范围语法,无需逐个输入列名 - 数据量大时优先选方法2,向量化处理速度远快于逐行计算
内容的提问来源于stack exchange,提问作者Wael
相关产品推荐
相关产品推荐

