【问题标题】:FIll zeros with previous value +1用先前的值 +1 填充零
【发布时间】: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] &lt;- approx(seq_along(day),replace(day,day==0 ,NA),xout=which(day==0))$y)

标签: r dplyr transform sequence fill


【解决方案1】:

你可以使用Reduce

data$day <-Reduce(function(x,y) if(y==0) x+1 else y, data$day,accumulate = TRUE)   
data
#   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

或者你已经使用tidyverse:

data %>% mutate(day = accumulate(day,~if(.y==0) .x+1 else .y))
#   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

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2022-11-23
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2014-09-19
    • 2011-10-09
    相关资源
    最近更新 更多