2015-04-26 43 views
6

trong khi sử dụng dplyr tôi gặp sự cố khi thay đổi giá trị cuối cùng khung dữ liệu của tôi. tôi muốn nhóm theo người dùng và thẻ và thay đổi Thời gian thành 0 cho giá trị/hàng cuối cùng trong nhóm.dplyr và đuôi để thay đổi giá trị cuối cùng trong một nhóm_by trong r

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

đầu ra mong muốn:

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

Tôi đã cố gắng để làm một cái gì đó như thế này, trong số những người khác và không thể tìm ra nó:

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

Tôi đã cố gắng thêm một số hàng là tốt, nhưng không thể đặt tất cả lại với nhau. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

5

tôi muốn cung cấp một cách tiếp cận khác mà sẽ tránh sao chép toàn bộ cột (những gì cả hai Time[-n()]replace làm) và cho phép sửa đổi tại chỗ

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 
9

Dưới đây là một lựa chọn:

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 

Những gì tôi đã làm ở đây là: tạo ra một vector của cột hiện có "Thời gian" với tất cả các yếu tố ngoại trừ người cuối cùng trong nhóm, trong đó có các chỉ số n() và thêm với vectơ đó 0 làm phần tử cuối cùng sử dụng c() để nối.

Lưu ý rằng trong đầu ra của tôi, giá trị Thời gian trong hàng 10 cũng được đổi thành 0 vì nó được coi là mục nhập cuối cùng của nhóm.

+4

tôi sẽ đề nghị một cái gì đó tương tự như: 'đột biến (Thời gian = thay thế (Thời gian, n(), 0) '. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, đó cũng sẽ là một cách tiếp cận rất tốt –

+1

Một tùy chọn khác, ít thanh lịch hơn có thể là:' mutate (Time = ifelse (row_number() == n() , 0, Thời gian)) ' –

Các vấn đề liên quan