按组用第一个观察值替换所有值

对于由“id”定义的每个组,我想选择列“x”和“y”的第一行中的值,并将所有后续值替换为该第一个值。

一些数据:

id    Visit   x        y
1      1      0        1
1      2      1        2
1      3      2        8
2      9      1       11
2      10     12      14

我想要:

id    Visit   x        y
1      1      0        1
1      2      0        1  # <- x & y replaced with first values of 'id' 1 
1      3      0        1  # 
2      9      1        11  
2      10     1        11 # <- x & y replaced with first values of 'id' 2 

我试过这个:

df1 <- df %>%
  arrange(id, Visit) %>%
  group_by(id) %>%
  fill(x, y, 
       .direction = 'down',)

然而,这似乎并没有做到。有人可以帮忙吗?

回答

使用的base替代方法duplicated

df[, c("x", "y")] = df[(i = !duplicated(df$id)), c("x", "y")][cumsum(i), ]
#   id Visit x  y
# 1  1     1 0  1
# 2  1     2 0  1
# 3  1     3 0  1
# 4  2     9 1 11
# 5  2    10 1 11

使用data.table滚动连接“填充”每个组中的第一个值(在较大数据上快速):

library(data.table)
setDT(df)
df[ , c("x", "y") := df[!duplicated(id)][.SD, on = .(id, Visit), .(x, y), roll = Inf]]
df
#    id Visit x  y
# 1:  1     1 0  1
# 2:  1     2 0  1
# 3:  1     3 0  1
# 4:  2     9 1 11
# 5:  2    10 1 11


以上是按组用第一个观察值替换所有值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>