2017-10-18 79 views
1

對應的值與分組數據的工作,我想改變的最後一個條目的一列在另一列該組匹配相應的價值。因此,對於我下面的數據,對於每一個「鳥巢」(組),最後的「狀態」項將等於該巢「命運」。替換最後一個值組與另一列

數據是這樣的:

nest Status fate 
    1  1  2 
    1  1  2 
    2  1  3 
    2  1  3 
    2  1  3 

期望的結果:

nest Status fate 
    1  1  2 
    1  2  2 
    2  1  3 
    2  1  3 
    2  3  3 

它應該是如此簡單。我試圖從dplyr and tail to change last value in a group_by in r以下;它正常工作對某些羣體,但在別人代替錯誤的「命運」值:

library(data.table) 
indx <- setDT(df)[, .I[.N], by = .(nest)]$V1 
df[indx, Status := df$fate] 

我得到的各種錯誤嘗試這種方法dplyr mutate/replace on a subset of rows

mutate_last <- function(.data, ...) { 
    n <- n_groups(.data) 
    indices <- attr(.data, "indices")[[n]] + 1 
    .data[indices, ] <- .data[indices, ] %>% mutate(...) 
    .data 
} 

df <- df %>% 
    group_by(nest) %>% 
    mutate_last(df, Status == fate) 

我必須失去了一些東西,從簡單資源上面提到的?

+0

猜測'data.table'嘗試的最後一行應該是'df [indx,Status:= fate]'。也嘗試'DF [,狀態:= C(狀態[ - N],命運[.N]。),通過巢=]'。 – nicola

回答

1

喜歡的東西

library(tidyverse) 

df <- data.frame(nest = c(1,1,2,2,2), 
       status = rep(1, 5), 
       fate = c(2,2,3,3,3)) 
df %>% 
    group_by(nest) %>% 
    mutate(status = c(status[-n()], tail(fate,1))) 
1

不知道這肯定是做到這一點的最好辦法,但這裏有一個非常簡單的解決方案:

library(dplyr) 
dat <- data.frame(nest = c(1,1,2,2,2), 
        Status = c(1,1,1,1,1), 
        fate = c(2,2,3,3,3)) 

dat %>% 
    arrange(nest, Status, fate) %>% #enforce order 
    group_by(nest) %>% 
    mutate(Status = ifelse(is.na(lead(nest)), fate, Status)) 

E:做了一個快速變化。