首页 文章

dplyr rowwise有滞后变量

提问于
浏览
0

我试图根据下面的代码使用另一个相关变量填充变量中的NAs .

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))

连续多个NAs也阻止我创建一个由滞后变量组成的新列 .

2 回答

  • 0

    您可以重复 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
    

    不过,我很确定这不会让你获得任何计算时间的效率 .

  • 1

    它不起作用,因为在行中,您在一行的子集上使用滞后 . 在进入rowwise模式之前创建一个新的y.lag列将起作用:

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

相关问题