我正在尝试动态填充变量,这需要我引用行。
有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 生态系统。有没有有效的方法来实现这一目标?
答案 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))
再次,它虽然不漂亮,但似乎可行。希望能帮助您从头开始。