基于dplyr处理数字列名的指定列均值合并问题
解决数字列名在dplyr中选择与行均值计算的问题
嘿,我碰到过好几次这种纯数字列名在dplyr里不好操作的情况,给你几个实用的解决方案,完美匹配你的需求:计算指定数字列的行均值、生成新列,同时保留指定列。
首先要注意一个关键细节:你的示例数据里数值列都是字符类型,第一步必须转换成数值型,不然rowMeans会报错。
方法1:用across()处理带反引号的列名范围
这是最直观的dplyr风格写法,across()可以轻松识别带反引号的数字列名范围:
library(dplyr) # 先转换数值列的类型(字符转数值) df_clean <- df %>% mutate(across(c(`1`, `2`, `34`, `158`, `190`), as.numeric)) # 计算行均值并生成目标数据框 result_df <- df_clean %>% mutate( Column1 = rowMeans(across(`1`:`2`)), # 计算1-2列的行均值 Column2 = rowMeans(across(`34`:`158`)), # 计算34-158列的行均值 Column3 = `190` # 保留190列并重命名为Column3 ) %>% select(Column1, Column2, Column3) # 只保留需要的新列
方法2:用列位置选择(适合列顺序固定的场景)
如果你的数据框列顺序不会变动,直接用列的位置索引会更简洁,不用打反引号:
result_df <- df_clean %>% mutate( Column1 = rowMeans(across(2:3)), # 1、2列对应数据框的第2、3列 Column2 = rowMeans(across(4:5)), # 34、158列对应第4、5列 Column3 = `190` ) %>% select(Column1, Column2, Column3)
方法3:用num_range()匹配数字列名(最简洁的写法)
针对纯数字列名,num_range()可以直接匹配指定范围的数字列,代码更清爽:
result_df <- df_clean %>% mutate( Column1 = rowMeans(across(num_range("", 1:2))), # 匹配列名1、2 Column2 = rowMeans(across(num_range("", 34:158))), # 匹配列名34到158 Column3 = `190` ) %>% select(Column1, Column2, Column3)
最终输出结果
运行上述代码后,你会得到符合预期的目标数据框:
Column1 Column2 Column3 1 1.9 3.40 22.1 2 6.8 1.65 7.4 3 4.7 23.85 56.0
内容的提问来源于stack exchange,提问作者Ecg
相关产品推荐
相关产品推荐

