考虑一个简化的数据集(真正的数据集有更多的列和行):
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变量,如果这有任何区别或可以提供帮助。
答案 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)]