dplyr по ряду с переменными лагом - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь заполнить NA в переменной, используя другую коррелированную переменную согласно приведенному ниже коду.

test <- tibble(x = c(1,4,3,2,5,6), y = c(2,NA,6,NA,NA,5))
test <- test %>% mutate(chng = x/lag(x,1))
for(i in 1:nrow(test)){
  if(is.na(test$y[i])) test$y[i] <- test$y[i - 1] * test$chng[i]
}

Могу ли я выполнить ту же операцию в dplyr?Я попытался по очереди, но кажется, что он не распознает функцию задержки.

test %>% rowwise() %>% mutate(y = ifelse(is.na(y), lag(y,1) * chng, y))

Несколько NA в ряду также не позволяют мне создать новый столбец, состоящий из запаздывающей переменной.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы могли бы просто повторять операцию dplyr, пока все NA не будут заполнены:

while(sum(is.na(test$y)) > 0){
  test <- test %>%
    mutate(y = ifelse(is.na(y), lag(y,1) * chng, y))
}

# A tibble: 6 x 3
      x     y   chng
  <dbl> <dbl>  <dbl>
1     1     2 NA    
2     4     8  4    
3     3     6  0.75 
4     2     4  0.667
5     5    10  2.5  
6     6     5  1.2 

Я почти уверен, что это не даст вам никакой эффективности для вычисления времени.

0 голосов
/ 10 декабря 2018

Это не работает, потому что по строкам вы используете задержку в подмножестве одной строки.Создание нового столбца y.lag перед входом в режим строки будет работать:

test %>% mutate(y.lag = lag(y,1)) %>% 
  rowwise() %>% 
  mutate(y = ifelse(is.na(y), y.lag * chng, y)) %>%
  select(-y.lag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...