【问题标题】:dplyr rowwise with lag variables具有滞后变量的 dplyr rowwise
【发布时间】:2018-12-10 08:47:15
【问题描述】:

我正在尝试按照下面的代码使用另一个相关变量将 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 也会阻止我创建包含滞后变量的新列。

【问题讨论】:

  • 我很确定您将无法放弃任何类型的 forwhile 循环。在y 列上连续NA 的情况下,您的操作取决于要完成的最后一行的迭代。

标签: r dplyr


【解决方案1】:

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

不过,我很确定这不会为您提高计算时间的效率。

【讨论】:

  • 谢谢。我想while和for之间没有太大区别。我真正应该问的实际问题是为什么我会拖延 3 行循环。
【解决方案2】:

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

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

【讨论】:

  • 这不能解决NAy 列中连续出现的情况。
猜你喜欢
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多