R语言:用变量替代数据框字段名调用summarize函数报错问题
解决summarize中动态列名调用的报错问题
嘿,我看到你遇到的问题啦!咱们先拆解下为啥tt会报错,然后给你搞定的办法~
错误原因分析
你写的BMI$get(paste0("V",2))是个典型的语法误区:$运算符是用来提取数据框中已存在的列,但你的BMI数据框里根本没有名为get的列,所以BMI$get会返回NULL。当你试图把NULL当作函数(加括号调用)时,就会触发attempt to apply non-function的错误。
正确的写法
要动态提取V1/V2这类列,有两种常用的正确方式:
方式1:使用数据框的[[索引(推荐)
[[运算符可以直接接受字符串作为列名,这是R中提取数据框列的标准方式之一:
# 修正后的tt代码 tt <- summarize(BMI[[paste0("V",2)]], BMI[[paste0("V",1)]], g) tt
方式2:正确使用get函数
get函数可以指定从某个环境(这里数据框BMI可视为一个环境)中提取对应名称的对象,需要加上envir参数:
tt <- summarize(get(paste0("V",2), envir = BMI), get(paste0("V",1), envir = BMI), g) tt
更通用的封装函数
如果你想写一个能接收1-10的数字输入,自动生成对应Vx列汇总的函数,可以这样封装(假设V1是分组列,V2-V10是需要汇总的数值列):
library(plyr) # 确保加载plyr包,你的summarize属于plyr包的版本 summarize_V_col <- function(col_index) { # 生成目标列名 target_col <- paste0("V", col_index) # 提取分组列和目标数值列 group_col <- BMI[["V1"]] num_col <- BMI[[target_col]] # 生成汇总 summarize(num_col, group_col, g) } # 调用示例:汇总V2列 summarize_V_col(2)
内容的提问来源于stack exchange,提问作者MrC
相关产品推荐
相关产品推荐

