R语言自定义年龄分组函数报错:tapply参数长度不一致求助
问题分析与修正方案
错误原因
原代码的核心问题有两个:
- 自定义函数
my_function中,循环判断的是索引值i(1到534),而非age向量的实际数值,完全偏离了年龄分组的逻辑; - 函数没有返回分组结果,执行后默认返回
NULL,导致tapply的第二个参数与wage长度不匹配,触发"arguments must have same length"错误。
修正方案
方案1:修复自定义循环函数
调整循环逻辑,针对age的每个数值判断,同时创建结果向量并返回:
age <- our_data$age wage <- our_data$wage my_function <- function(age_vec) { # 创建空向量存储分组结果 group <- character(length(age_vec)) for(i in 1:length(age_vec)) { if (age_vec[i] <= 35) { group[i] <- "young" } else if(age_vec[i] > 35 & age_vec[i] <= 55) { group[i] <- "adult" } else { group[i] <- "old" } } # 返回分组结果 return(group) } # 调用函数并计算平均工资 tapply(wage, my_function(age), mean)
方案2:用R内置函数简化(更高效)
不需要写循环,用cut函数直接完成分组,代码更简洁:
age_group <- cut(age, breaks = c(-Inf, 35, 55, Inf), labels = c("young", "adult", "old"), include.lowest = TRUE) tapply(wage, age_group, mean)
也可以用嵌套ifelse实现:
age_group <- ifelse(age <=35, "young", ifelse(age <=55, "adult", "old")) tapply(wage, age_group, mean)
内容的提问来源于stack exchange,提问作者user14428298
相关产品推荐
相关产品推荐

