从组

时间:2017-06-01 12:38:51

标签: r dplyr

问题:如何在发生某个值之前向后填充组中的所有行。我并非尝试使用zoo na.locf填写NA或缺失值。在下面,我想在每个ID组发生1.00之前填充A中的所有先前行和1.00,理想情况下使用dplyr

输入:

data<- data.frame(ID=c(1,1,1,1,2,2,2,3,3,3,4,4,4,4,4), 
              time=c(1,2,3,4,1,2,3,1,2,3,1,2,3,4,5),
              A=c(0.10,0.25,1,0,0.25,1,0.25,0,1,0.10,1,0.10,0.10,0.10,0.05))
ID time    A
1    1     0.10
1    2     0.25
1    3     1.00
1    4     0.00
2    1     0.25
2    2     1.00
2    3     0.25
3    1     0.00
3    2     1.00
3    3     0.10
4    1     1.00
4    2     0.10
4    3     0.10
4    4     0.10
4    5     0.05

期望的输出:

ID time    A
1    1     1.00
1    2     1.00
1    3     1.00
1    4     0.00
2    1     1.00
2    2     1.00
2    3     0.25
3    1     1.00
3    2     1.00
3    3     0.10
4    1     1.00
4    2     0.10
4    3     0.10
4    4     0.10
4    5     0.05

2 个答案:

答案 0 :(得分:6)

按ID分组后,您可以检查1的累积总和以及它仍低于1(尚未出现)的位置,将A值替换为1:

data %>% 
  group_by(ID) %>% 
  mutate(A = replace(A, cumsum(A == 1) < 1, 1))
# Source: local data frame [15 x 3]
# Groups: ID [4]
# 
# ID  time     A
# <dbl> <dbl> <dbl>
# 1      1     1  1.00
# 2      1     2  1.00
# 3      1     3  1.00
# 4      1     4  0.00
# 5      2     1  1.00
# 6      2     2  1.00
# 7      2     3  0.25
# 8      3     1  1.00
# 9      3     2  1.00
# 10     3     3  0.10
# 11     4     1  1.00
# 12     4     2  0.10
# 13     4     3  0.10
# 14     4     4  0.10
# 15     4     5  0.05

非常相似,您也可以使用cummax

data %>% group_by(ID) %>% mutate(A = replace(A, !cummax(A == 1), 1))

这是一个基础R方法:

transform(data, A = ave(A, ID, FUN = function(x) replace(x, !cummax(x == 1), 1)))

答案 1 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(data)),获取'A'为1的行,找到行的序列,将其用作i赋值({{ 1}})'A'中的值为1

:=

或者我们可以使用library(data.table) setDT(data)[data[, .I[seq_len(which(A==1))], ID]$V1, A := 1][] # ID time A # 1: 1 1 1.00 # 2: 1 2 1.00 # 3: 1 3 1.00 # 4: 1 4 0.00 # 5: 2 1 1.00 # 6: 2 2 1.00 # 7: 2 3 0.25 # 8: 3 1 1.00 # 9: 3 2 1.00 #10: 3 3 0.10 #11: 4 1 1.00 #12: 4 2 0.10 #13: 4 3 0.10 #14: 4 4 0.10 #15: 4 5 0.05

中的ave
base R