如何将列的中位数保存为整数?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'
请问如何解决该报错,并将计算得到的中位数保存为整数?
解决方案
报错原因
- 管道符使用错误:
dplyr的%>%需要传递前一步的数据集,但你直接在管道后写赋值语句,导致median()接收的不是数据框里的rank列,而是R内置的rank()函数(属于闭包类型,非原子向量),触发类型错误。 - 函数无有效返回值:当前代码没有明确返回计算结果,即使逻辑修复也无法输出数值。
修正步骤
- 用
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
相关产品推荐
相关产品推荐

