【问题标题】:R - Error computing interpolated mean by groupR - 按组计算插值平均值的错误
【发布时间】:2019-07-19 23:35:21
【问题描述】:

我正在尝试按组计算多个变量的插值中位数。 我的数据框如下所示:

# A tibble: 6 x 8
  id            eu_image eu_insurance eurobonds free_movement_welfare eu_cn_solidarity country_code country_party_mass
  <chr>            <dbl>        <dbl>     <dbl>                 <dbl>            <dbl> <dbl+lbl>    <chr>             
1 CAWI200000100        4            4         4                     3                3 2            germany_7         
2 CAWI300000784        2            2         1                     1                1 3            italy_9           
3 CAWI100000787        3            3         2                     2                3 1            france_13         
4 CAWI500000081        3            2         2                     1                3 5            spain_2           
5 CATI500000067        4            3         2                     2                6 5            spain_3           
6 CAWI100000398        2            4         4                     2                5 1            france_2 

当我运行以下代码通过分组变量 country_party_mass 计算插值平均值时:

party_median <- newdata %>%
    group_by(country_party_mass) %>%
    dplyr::summarise_at(c(   "eu_image", 
                      "eu_cn_solidarity", 
                      "eurobonds", 
                      "free_movement_welfare", 
                      "eu_insurance"), 
    funs(interp.median(., na.rm=TRUE))) %>%
    as.data.frame()

我收到以下错误

summarise_impl(.data, dots) 中的错误: eu_cn_solidarity 列的长度必须为 1(汇总值),而不是 0

我已经检查过之前关于类似问题的问题,但我找不到可行的解决方案。

【问题讨论】:

  • 对于某些country_party_mass,所有eu_cn_solidarity 都是不适用的。例如mtcars[mtcars$cyl==4,'gear']&lt;-NA;mtcars %&gt;% group_by(cyl) %&gt;% summarise_at(vars(c('hp','gear')),~interp.median(.,na.rm = TRUE))
  • 谢谢,这是实际问题。您是否知道是否有一种方法可以将组名保留为 NA 而不是观察值不足的组的中位数?
  • 我认为 Cettt 的回答可以胜任。

标签: r group-by dplyr median


【解决方案1】:

基于 A. Suliman 的评论: 您可以添加一个ifelse 函数来检查所有条目是否为NA

party_median <- newdata %>%
    group_by(country_party_mass) %>%
    dplyr::summarise_at(vars(c("eu_image", 
                      "eu_cn_solidarity", 
                      "eurobonds", 
                      "free_movement_welfare", 
                      "eu_insurance")), 
    ~ifelse(all(is.na(.)), NA_real_, interp.median(., na.rm=TRUE)))

请注意,funs 函数现在已软弃用(从 dplyr 0.8.0.1 开始),因此我改用“~”表示法。我也使用vars 函数来选择变量。

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 2012-04-05
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多