R语言匹配向量列名对dataframe按行求和报错的解决方法
问题背景
现有一个由整数型数值、社区名称列构成的dataframe,已提前按区域分组创建了存储对应社区列名的向量,初始代码与示例数据如下:
# 初始向量写法(存在错误,后续会修正) RegionA <- c(a,c,d) RegionB <- c(b,e,f) RegionC <- c(g,h,i)
Year a b c d e f g h i `5` <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int> <dbl> 1 2021 61 44 1 78 37 46 33 16 57 5 2 2020 60 54 60 2 72 59 60 34 60 5 3 2019 53 77 39 66 85 82 65 95 50 5 4 2018 78 20 63 26 41 29 19 82 46 5 5 2017 62 38 22 23 6 11 20 51 65 5 6 2021 39 15 38 74 90 83 73 12 71 5 7 2020 28 23 76 57 100 89 62 14 56 5 8 2019 82 48 40 45 93 72 40 45 29 5 9 2018 13 69 100 13 5 52 99 52 47 5 10 2017 92 13 13 96 98 17 46 49 74 5
需求为匹配各区域向量存储的列名,对对应列的数值按行求和生成新列。先后尝试两段dplyr代码均运行失败:
# 尝试1 df <- df %>% mutate(Region_A = rowSums(select(., colnames %in% RegionA)))
# 尝试2 df <- df %>% rowwise %>% mutate(Region_A = sum(c_across(where(colnames %in% RegionA))))
报错信息为:
Caused by error in `match()`: ! 'match' requires vector arguments
错误原因
代码报错来自两处核心写法错误:
- 区域向量定义不规范:列名属于字符串类型,创建向量时未给列名加双引号,R会将a、c、d等识别为未定义的对象,而非列名字符串
- 选列逻辑不符合dplyr语法规则:
- 第一段代码中直接写
colnames %in% RegionA,colnames是提取列名的函数,不是存储当前数据框列名的变量,无法直接参与匹配运算 - 第二段代码误用
where()函数:where()仅接收判断列属性的谓词函数(比如is.numeric、is.integer),不能直接传入列名匹配规则
- 第一段代码中直接写
正确实现方法
首先修正区域向量的定义,给所有列名加上双引号,再使用all_of()函数(tidyselect工具包提供,专门用于传入外部存储列名的字符向量)完成选列,推荐两种写法:
写法1:rowSums 方案(性能最优)
无需逐行运算,大数据量下运行速度更快,推荐优先使用:
library(dplyr) # 第一步:修正区域向量,列名加引号转为字符向量 RegionA <- c("a","c","d") RegionB <- c("b","e","f") RegionC <- c("g","h","i") # 第二步:按行求和生成新列 df <- df %>% mutate( Region_A = rowSums(select(., all_of(RegionA)), na.rm = TRUE), Region_B = rowSums(select(., all_of(RegionB)), na.rm = TRUE), Region_C = rowSums(select(., all_of(RegionC)), na.rm = TRUE) )
参数na.rm = TRUE用于自动跳过缺失值,避免求和结果返回NA,无缺失值时可删除该参数。
写法2:rowwise + c_across 方案
语法更直观,适合需要逐行做复杂运算的场景,注意用完rowwise后要调用ungroup()取消逐行分组,避免影响后续操作:
df <- df %>% rowwise() %>% mutate( Region_A = sum(c_across(all_of(RegionA)), na.rm = TRUE), Region_B = sum(c_across(all_of(RegionB)), na.rm = TRUE), Region_C = sum(c_across(all_of(RegionC)), na.rm = TRUE) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者a nony mouse
相关产品推荐
相关产品推荐

