2016-09-03 5 views
3

Рассмотрим упрощенный набор данных (реальный один имеет несколько столбцов и строк):R подведением группой двух переменных

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 

Я хочу, чтобы заполнить недостающие значения в весе по сгруппированных срединной Т.П. и ТФ в сочетании

Что я пытался до сих пор является следующее (я использовал 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, соответствующий тп = СЧ и Tf = РФ, медианное значение, если вы посмотрите на темп является 78,93815

Как мне это сделать вообще? Предлагайте, если у вас есть лучший подход, чем мой первоначальный.

EDIT: Фактический dataframe имеет уникальную переменную Id, если это имеет какое-либо значение или может помочь.

ответ

4

Вы можете попробовать,

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

Отлично! очень краткий ответ, можете ли вы предложить то, что я должен делать, если мне нужно продолжить с того места, где я ушел? Я полагаю, что я должен использовать некоторые функции приложения, чтобы проверить значения столбца и соответственно изменить их? –

+0

Аналогичным образом вы можете выполнить команду 'df%>% group_by (tp, tf)%>% mutate (weight = recode (weight, .missing = mean (weight, na.rm = T))). – jazzurro

+0

'is.na' векторизован, нет необходимости в цикле. – Sotos

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)] 
Смежные вопросы