Заменить значение в data.frame внутри функции (для использования с apply) - PullRequest
1 голос
/ 15 октября 2019

У меня есть data.frame, который выглядит следующим образом:

GROUP  |  YEAR  | VAL
A      |  2007  | 10
A      |  2007  | 11
A      |  2007  | NA
A      |  2008  | 13
B      |  2006  | NA
B      |  2006  | 5
B      |  2006  | 6

Так что у каждой группы могут быть разные годы. Я хочу заменить эти NA средним значением соответствующей группы в соответствующем году. Например, для NA в строке 3 он будет заменен средним значением группы A в 2007 году.

Я могу сделать это с помощью цикла for, но, к сожалению, мой профессор ненавидит «за»петля, поэтому я пытаюсь найти другой путь. Я попытался использовать функцию, подобную этой: imputeMean(group,year), для вычисления среднего значения требуется группа и год, а затем мутирует data.frame. Затем я применяю эту функцию к data.frame группы и года, подлежащего замене.

К сожалению, R не имеет передачи по ссылке, что означает, что я не могу изменить исходный data.frame непосредственно вфункция imputeMean(). В любом случае можно рассчитать фильтр для data.frame, рассчитать среднее по группе относительно года и заменить значение NA на это среднее без использования цикла?

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Другое dplyr решение:

library(dplyr)

df1 %>%  
  group_by(GROUP, YEAR) %>%
  mutate_at(vars(VAL) , list(~ifelse(is.na(.), mean(., na.rm = TRUE),.)))

#   GROUP  YEAR   VAL
# 1 A      2007  10  
# 2 A      2007  11  
# 3 A      2007  10.5
# 4 A      2008  13  
# 5 B      2006   5.5
# 6 B      2006   5  
# 7 B      2006   6  
1 голос
/ 15 октября 2019

Мы можем использовать na.aggregate после группировки по 'GROUP', 'YEAR'

library(dplyr)
library(zoo)
df1 %>%
    group_by(GROUP, YEAR) %>%
    mutate(VAL = na.aggregate(VAL))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...