使用sapply生成统计结果时如何保留/设置列名?
我来帮你搞定这个问题!你现在遇到两个小问题:一是手动拼出来的列列表没给元素命名,导致sapply返回的结果没有列名;二是原来的函数返回的是无命名向量,结果连统计量的行名都没有。不过很容易解决,下面给你几种方案:
方法1:直接对数据框目标列应用sapply(最省心)
不用手动构建列表,直接从数据框中选择需要的列,sapply会自动保留原变量名;同时优化自定义函数,给返回的向量命名,让结果自动带上统计量的行名:
# 优化自定义函数:给返回向量命名,同时加na.rm避免NA干扰统计结果 sfsum <- function(x){ mean_val <- mean(x, na.rm = TRUE) sd_val <- sd(x, na.rm = TRUE) min_val <- min(x, na.rm = TRUE) max_val <- max(x, na.rm = TRUE) # 返回带统计量名称的向量 return(c(mean = mean_val, sd = sd_val, min = min_val, max = max_val)) } # 定义需要统计的目标列名 target_cols <- c("age_child", "earnings_child", "logchildinc", "p_inc84", "login84", "p_inc85", "login85", "p_inc86", "login86", "p_inc87", "login87", "p_inc88", "login88") # 直接对数据框的目标列应用函数,结果自动带列名(原变量名)和行名(统计量) summ <- sapply(sfbalanced[, target_cols], sfsum) # 此时summ的结构完全符合你的需求:行是mean/sd/min/max,列是原变量名
方法2:给手动创建的列表添加名字
如果你坚持要用手动构建的列表,只需要给列表的每个元素指定对应变量名即可:
# 给列表的每个元素命名,对应原数据框的列名 c <- list( age_child = sfbalanced$age_child, earnings_child = sfbalanced$earnings_child, logchildinc = sfbalanced$logchildinc, p_inc84 = sfbalanced$p_inc84, login84 = sfbalanced$login84, p_inc85 = sfbalanced$p_inc85, login85 = sfbalanced$login85, p_inc86 = sfbalanced$p_inc86, login86 = sfbalanced$login86, p_inc87 = sfbalanced$p_inc87, login87 = sfbalanced$login87, p_inc88 = sfbalanced$p_inc88, login88 = sfbalanced$login88 ) # 应用优化后的sfsum函数 summ <- sapply(c, sfsum) # 此时summ已经自动带上了原变量列名和统计量行名
方法3:手动给已生成的summ补全名称(补救方案)
如果已经运行了原来的代码,想直接补救的话,可以手动指定列名和行名:
# 给summ添加列名,对应原变量名 colnames(summ) <- c("age_child", "earnings_child", "logchildinc", "p_inc84", "login84", "p_inc85", "login85", "p_inc86", "login86", "p_inc87", "login87", "p_inc88", "login88") # 添加行名,对应统计量 rownames(summ) <- c("mean", "sd", "min", "max")
小提醒:原来的函数里用了mean、sd这类R内置函数名作为变量名,虽然不会报错,但容易混淆,建议改成mean_val这类名称,减少潜在bug~
内容的提问来源于stack exchange,提问作者Morag McDonald
相关产品推荐
相关产品推荐

