【发布时间】:2019-01-23 16:02:03
【问题描述】:
我有一个按用户分组的记录。在变量“day”中有一些 0,我想按顺序替换它们(= 前一个值 +1)。
data <- data.frame(user = c(1,1,1,2,2,2,2,2), day = c(170,0,172,34,35,0,0,38))
data
user day
1 1 170
2 1 0
3 1 172
4 2 34
5 2 35
6 2 0
7 2 0
8 2 38
我想要以下:
data_new
user day
1 1 170
2 1 171
3 1 172
4 2 34
5 2 35
6 2 36
7 2 37
8 2 38
我已经尝试了以下方法(确实效率低下并且不适用于所有情况...):
data = group_by(data, user) %>%
+ mutate(lead_day = lead(day),
+ day_new = case_when(day == 0 ~ lead_day - 1,
+ day > 0 ~ day))
> data
# A tibble: 8 x 4
# Groups: user [2]
user day lead_day day_new
<dbl> <dbl> <dbl> <dbl>
1 1 170 0 170
2 1 0 172 171
3 1 172 NA 172
4 2 34 35 34
5 2 35 0 35
6 2 0 0 -1
7 2 0 38 37
8 2 38 NA 38
【问题讨论】:
-
你能分享你的预期输出吗?
-
在您的示例中,序列 在 0 之后总是有一个数字。如果这反映了您的真实数据,您可以使用
approx进行线性插值,like this。 -
谢谢,这行得通!这是最好的方法吗? data$day[data$day == 0] % mutate(day = na.approx(day))
-
在你可以做的同样效果的基础上:
within(data, day[day==0] <- approx(seq_along(day),replace(day,day==0 ,NA),xout=which(day==0))$y)
标签: r dplyr transform sequence fill