dplyr 和 tail 更改 r 中 group_by 中的最后一个值
dplyr and tail to change last value in a group_by in r
在使用 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)
我也尝试添加行号,但无法将它们完全放在一起。任何帮助将不胜感激。
这里有一个选项:
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()
并添加到该向量中0
作为最后一个元素,使用 c()
进行串联。
请注意,在我的输出中,第 10 行的时间值也更改为 0,因为它被视为组的最后一个条目。
我想提供一种替代方法,该方法将避免复制整个列(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
在使用 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)
我也尝试添加行号,但无法将它们完全放在一起。任何帮助将不胜感激。
这里有一个选项:
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()
并添加到该向量中0
作为最后一个元素,使用 c()
进行串联。
请注意,在我的输出中,第 10 行的时间值也更改为 0,因为它被视为组的最后一个条目。
我想提供一种替代方法,该方法将避免复制整个列(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