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

如何将列的中位数保存为整数?R语言函数报错求助

问题描述

我正在编写一个计算特定列中位数的函数,使用的是SSA的姓名数据,数据摘要如下:

name               sex                count             year           rank     
 Length:12736       Length:12736       Min.   :   5.0   Min.   :1880   Min.   :   1  
 Class :character   Class :character   1st Qu.:   7.0   1st Qu.:1881   1st Qu.: 531  
 Mode  :character   Mode  :character   Median :  13.0   Median :1883   Median :1062  
                                       Mean   : 103.4   Mean   :1883   Mean   :1066  
                                       3rd Qu.:  42.0   3rd Qu.:1884   3rd Qu.:1592  
                                       Max.   :9655.0   Max.   :1885   Max.   :2297 

我想要计算特定姓名的rank中位数,编写了如下函数:

# Return a vector of each year's deviation from the total median
delta_from_median_vector <- function(names, v_name, v_sex){
  #Find the median count
  names %>%
    filter(name==v_name & sex==v_sex) %>%
        m <- median(rank)
}

运行时出现以下错误:

Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic
In addition: Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'closure'

请问如何解决该报错,并将计算得到的中位数保存为整数?


解决方案

报错原因

  1. 管道符使用错误:dplyr的%>%需要传递前一步的数据集,但你直接在管道后写赋值语句,导致median()接收的不是数据框里的rank列,而是R内置的rank()函数(属于闭包类型,非原子向量),触发类型错误。
  2. 函数无有效返回值:当前代码没有明确返回计算结果,即使逻辑修复也无法输出数值。

修正步骤

  • 用pull(rank)从过滤后的数据集里提取rank列的原子向量,再传入median()计算。
  • 用as.integer()将中位数转换为整数类型。
  • 确保函数通过管道传递最终结果作为返回值。
  • 建议将参数名names改为names_df,避免和R内置函数names()冲突。

修正后的代码

delta_from_median_vector <- function(names_df, v_name, v_sex){
  names_df %>%
    filter(name == v_name & sex == v_sex) %>%
    pull(rank) %>%
    median() %>%
    as.integer()
}

补充说明

  • 如果数据中存在缺失值,可在median()中添加na.rm = TRUE参数忽略缺失值,即median(na.rm = TRUE)。
  • 调用示例:delta_from_median_vector(your_ssa_data, "Mary", "F")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:05:44