dplyr和tail改变r中group_by的最后一个值

itj*_*s18 9 r tail dplyr

使用dplyr时,我无法更改数据帧的最后一个值.我想按用户和标记进行分组,并将时间更改为0,以获取组中的最后一个值/行.

     user_id     tag   Time
1  268096674       1    3
2  268096674       1    10
3  268096674       1    1
4  268096674       1    0
5  268096674       1    9999
6  268096674       2    0
7  268096674       2    9
8  268096674       2    500
9  268096674       3    0
10 268096674       3    1
...
Run Code Online (Sandbox Code Playgroud)

期望的输出:

     user_id     tag   Time
1  268096674       1    3
2  268096674       1    10
3  268096674       1    1
4  268096674       1    0
5  268096674       1    0
6  268096674       2    0
7  268096674       2    9
8  268096674       2    0
9  268096674       3    0
10 268096674       3    1
...
Run Code Online (Sandbox Code Playgroud)

我试图做这样的事情,除其他外,无法搞清楚:

df %>%
  group_by(user_id,tag) %>%
  mutate(tail(Time) <- 0)
Run Code Online (Sandbox Code Playgroud)

我也尝试添加一个行号,但不能完全把它们放在一起.任何帮助,将不胜感激.

tal*_*lat 11

这是一个选项:

df %>%
  group_by(user_id, tag) %>%
  mutate(Time = c(Time[-n()], 0))
#Source: local data frame [10 x 3]
#Groups: user_id, tag
#
#     user_id tag Time
#1  268096674   1    3
#2  268096674   1   10
#3  268096674   1    1
#4  268096674   1    0
#5  268096674   1    0
#6  268096674   2    0
#7  268096674   2    9
#8  268096674   2    0
#9  268096674   3    0
#10 268096674   3    0
Run Code Online (Sandbox Code Playgroud)

我在这里做的是:创建现有列"Time"的向量,除了组中的最后一个元素之外的所有元素,它具有索引n()并添加到该向量a 0作为c()用于连接的最后一个元素.

请注意,在我的输出中,第10行中的时间值也更改为0,因为它被视为组的最后一个条目.

  • 我打算提出类似的建议:`mutate(Time = replace(Time,n(),0)`. (6认同)
  • 另一个不太优雅的选项可能是:`mutate(Time = ifelse(row_number()== n(),0,Time)) (2认同)

Dav*_*urg 6

我想提出一个替代办法,这将避免复制整列(什么都Time[-n()]replace做的),并允许在就地修改

library(data.table)
indx <- setDT(df)[, .I[.N], by = .(user_id, tag)]$V1 # finding the last incidences per group
df[indx, Time := 0L] # modifying in place
df
#       user_id tag Time
#  1: 268096674   1    3
#  2: 268096674   1   10
#  3: 268096674   1    1
#  4: 268096674   1    0
#  5: 268096674   1    0
#  6: 268096674   2    0
#  7: 268096674   2    9
#  8: 268096674   2    0
#  9: 268096674   3    0
# 10: 268096674   3    0
Run Code Online (Sandbox Code Playgroud)