2015-04-26 7 views
6

podczas korzystania z dplyr Mam problem ze zmianą ostatniej wartości mojej ramki danych. Chcę pogrupować według użytkownika i znacznika i zmienić Czas na 0 dla ostatniej wartości/wiersza w grupie.dplyr i ogon, aby zmienić ostatnią wartość w group_by w 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 
... 

Pożądany wyjściowa:

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

Starałem się zrobić coś takiego, między innymi i nie może zrozumieć to:

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

Próbowałem dodawania numer wiersza również, ale nie potrafił tego wszystkiego połączyć. jakakolwiek pomoc byłaby doceniona.

Odpowiedz

5

Chciałbym zaoferować alternatywne podejście, które będzie uniknąć kopiując całą kolumnę (co zarówno Time[-n()] i replace zrobić) i umożliwiają modyfikację w miejscu

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

Oto opcja:

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 

co zrobiłem tutaj jest: tworzenie wektor istniejącej kolumny „Time” ze wszystkimi elementami, z wyjątkiem ostatniego w grupie, która ma indeks n() i dodać do tego wektora 0 jako ostatniego elementu używającego c() do konkatenacji.

Należy zauważyć, że w moim wyniku wartość czasu w wierszu 10 jest również zmieniana na 0, ponieważ jest uważana za ostatni wpis grupy.

+4

miałem zamiar zaproponować coś podobnego: 'mutate (Time = replace (Time, n(), 0) '. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, to byłoby również bardzo dobre podejście –

+1

Inną, mniej elegancką opcją może być:' mutate (Time = ifelse (row_number() == n() , 0, Czas)) ' –

Powiązane problemy