【问题标题】:Summarizing by group of two variables按两个变量组汇总
【发布时间】:2017-01-11 09:36:35
【问题描述】:

考虑一个简化的数据集(真实的有更多的列和行):

df
    tp tf   weight
1  FWD RF 78.86166
2   MF LF 81.04566
3  DEF LF 80.70527
4  DEF LF 82.96071
5  DEF RF 78.42544
6   GK LF 79.37686
7  DEF RF 78.79928
8   MF RF       NA
9   MF RF 78.93815
10 DEF RF 80.00284

我想用 tp 和 tf 组合的 median 来填充权重中的缺失值

到目前为止我尝试过的是以下(我使用过 dlpyr)

temp <- df %>% group_by(tp,tf) %>% summarise(mvalue = median(weight,na. rm = TRUE))

这给出了温度:

temp
Source: local data frame [6 x 3]
Groups: tp [?]

      tp     tf   mvalue
  <fctr> <fctr>    <dbl>
1    DEF     LF 81.83299
2    DEF     RF 78.79928
3    FWD     RF 78.86166
4     GK     LF 79.37686
5     MF     LF 81.04566
6     MF     RF 78.93815

现在我无法弄清楚如何用相应的组中位数填充 df 中的缺失值。

在我的简单情况下,只有一个 NA 对应于 tp = MF 和 tf = RF, 抬头看 temp 的中值为 78.93815

我通常如何做到这一点?如果您有比我最初的方法更好的方法,请提出建议。

编辑: 实际的数据框有一个唯一的 Id 变量,如果这有什么不同或有帮助的话。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以试试,

    library(dplyr)
    df %>% 
       group_by(tp, tf) %>% 
       mutate(weight = replace(weight, is.na(weight), median(weight, na.rm = TRUE)))
    

    【讨论】:

    • 太棒了!非常简洁的答案,如果我不得不从我离开的地方继续,你能建议我该怎么做吗?我想我应该使用一些应用函数来检查列值并进行相应修改?
    • 以类似的方式,您可以使用df %&gt;% group_by(tp, tf) %&gt;% mutate(weight = recode(weight, .missing = mean(weight, na.rm = T)))
    • is.na 是矢量化的,不需要循环。
    • @jazzurro recode 在哪里?不是基本功能吗?
    • 是的,我想...我现在才更新:)
    【解决方案2】:

    我们可以使用zoo 中的na.aggregate 并将FUN 参数更改为median。默认为mean

    library(zoo)
    library(dplyr)
    df %>% 
       group_by(tp, tf) %>%
        mutate(weight = na.aggregate(weight, FUN = median))
    #     tp    tf   weight
    #   <chr> <chr>    <dbl>
    #1    FWD    RF 78.86166
    #2     MF    LF 81.04566
    #3    DEF    LF 80.70527
    #4    DEF    LF 82.96071
    #5    DEF    RF 78.42544
    #6     GK    LF 79.37686
    #7    DEF    RF 78.79928
    #8     MF    RF 78.93815
    #9     MF    RF 78.93815
    #10   DEF    RF 80.00284
    

    data.table 的对应语法是

    library(data.table)
    setDT(df)[, weight := na.aggregate(weight, FUN = median), by = .(tp, tf)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2018-11-03
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多