You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言编写自定义函数处理mtcars数据集:移除多水平因子、计算统计量并生成目标数据集

自定义R函数实现数据集汇总(匹配预期输出)

我来帮你修正代码,实现你需要的三个核心功能。先梳理下原代码存在的几个关键问题:

  • 缺少移除水平数超过2的因子列的核心逻辑
  • 计算数值列均值时错误调用了整个数据集的describe()结果,而非单列的均值
  • 因子列的比例存储逻辑混乱,没有针对水平数为2的因子做定向处理
  • 最终输出结构不符合预期,我们需要的是变量-结果的对应集合,而非两个分离的列表

修正后的完整代码

# 加载数据并转换因子列
data(mtcars)
mtcars$vs <- as.factor(mtcars$vs)
mtcars$cyl <- as.factor(mtcars$cyl) # 该列会被移除

my_summary_function <- function(df) {
  # 第一步:移除水平数超过2的因子列
  keep_cols <- sapply(df, function(col) {
    if (is.factor(col)) {
      nlevels(col) <= 2
    } else {
      TRUE
    }
  })
  df_clean <- df[, keep_cols, drop = FALSE]
  
  # 第二步:计算各列的汇总值
  result <- sapply(df_clean, function(col) {
    if (is.factor(col)) {
      # 对水平数为2的因子,计算值为"1"的比例(匹配预期输出)
      prop.table(table(col))[["1"]]
    } else {
      # 数值列计算均值,添加na.rm增强健壮性
      mean(col, na.rm = TRUE)
    }
  })
  
  # 第三步:保留原始变量顺序,为被移除的列填充NA
  all_vars <- colnames(df)
  final_result <- setNames(rep(NA, length(all_vars)), all_vars)
  final_result[names(result)] <- result
  
  return(final_result)
}

# 调用函数并输出结果
output <- my_summary_function(mtcars)
print(output, digits = 4)

代码关键逻辑解释

  1. 移除高水平因子列:
    通过sapply()遍历每一列,判断如果是因子且水平数>2就排除,保留其他所有列,得到清理后的数据集df_clean。

  2. 计算汇总值:

    • 对于水平数为2的因子列(比如vs、am),计算prop.table()中对应"1"的比例,这和你给出的预期输出完全匹配(比如vs的14/32=0.4375)。
    • 数值列直接用mean()计算均值,加上na.rm=TRUE处理可能的缺失值(虽然mtcars无缺失,但让代码更健壮)。
  3. 匹配预期输出结构:
    为了保留原始数据集的所有变量名(包括被移除的cyl),我们初始化一个包含所有变量的向量,将计算好的结果填充进去,被移除的列自动保留NA值,完美匹配预期的变量顺序和格式。

运行结果

mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear    carb 
 20.090      NA 230.722 146.688   3.597   3.217  17.849   0.438   0.406   3.688   2.812 

数值的小数位数可以通过print()的digits参数灵活调整,完全符合你的预期输出要求。

内容的提问来源于stack exchange,提问作者symkly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:27:40