通过两组变量汇总

时间:2016-09-03 11:37:47

标签: r dplyr

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

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组合的中位数填充缺失的重量值

我到目前为止所尝试的是以下(我使用过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, 如果你抬头看温度,那么中值是78.93815

我一般如何做到这一点?如果你有一个比我最初的方法更好的方法,请建议。

修改 实际的数据框有一个唯一的Id变量,如果这有任何区别或可以提供帮助。

2 个答案:

答案 0 :(得分:5)

你可以尝试,

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

答案 1 :(得分:4)

我们可以使用na.aggregate中的zoo并将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)]