使用dplyr和tail函数在R中更改group_by中的最后一个值

10

在使用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
...

期望输出:

     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
...

我尝试过类似这样的事情,还有其他的事情,但是我搞不明白:

df %>%
  group_by(user_id,tag) %>%
  mutate(tail(Time) <- 0)

我尝试添加行号,但是无法完全整合。 希望得到任何帮助。

2个回答

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
我在这里做的是: 使用现有列"Time"创建一个向量,除了该组中最后一个元素的索引为n()外,所有元素都包括在内,然后使用c()进行连接,在该向量中添加一个0作为最后一个元素。
请注意,在我的输出中,第10行的时间值也被更改为0,因为它被认为是该组的最后一个条目。

7
我本来也想建议类似的东西:mutate(Time = replace(Time, n(), 0) - A5C1D2H2I1M1N2O1R2T1
2
另一个不太优雅的选择可能是:mutate(Time = ifelse(row_number() == n(), 0, Time)) - Steven Beaupré

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接