有效地遍历行以动态/顺序地填充行尾的变量

时间:2018-06-19 18:56:29

标签: r loops dplyr

我正在尝试动态填充变量,这需要我引用行。

有3列:时间 val

我想填充第3、4、7和8行的 val ,它们最初是 NA

这是我的玩具数据:

df <- expand.grid(time = rep(c(1,2,3,4)), group = rep(c("A", "B")))
df$val <- c(50,40,NA,NA)

df

> df
     time group val
  1    1     A  50
  2    2     A  40
  3    3     A  NA
  4    4     A  NA
  5    1     B  50
  6    2     B  40
  7    3     B  NA
  8    4     B  NA

我有两个分组变量( 时间 group ),例如,我需要填充根据以下规则, 第3行

1. Order by group and time (in ascending order)
2. For time = 3, the value of **val** is the arithmetic average of two previous rows; 
   (2a). i.e. the average of time 2 and time 1 values, so it will be 1/2 * (40+50) = 45.
3. For time = 4, the value of **val** is the arithmetic average of two previous rows;
    (3a). i.e. the average of time 3 and time 2 values, so it will be 1/2 * (45+40) = 42.5.

依次类推,直到由 time group 变量定义的每个组的最后一行。

我想避免使用循环和引用行索引来实现这一目标,而是希望留在 dplyr 内,因为我的其余脚本都在 dplyr 生态系统。有没有有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

这不是最干净的解决方案,但可以完成工作:

df2 = df %>%
    arrange(group, time) %>%
    mutate(val = if_else(is.na(val), (lag(val, n=1) + lag(val, n=2))/2.0, val)) %>%
    mutate(val = if_else(is.na(val), (lag(val, n=1) + lag(val, n=2))/2.0, val))

再次,它虽然不漂亮,但似乎可行。希望能帮助您从头开始。