将组中的最后一个值替换为其他列中的相应值

时间:2017-10-18 21:05:12

标签: r

使用分组数据,我想更改一列中的最后一个条目,以匹配另一列中该组的相应值。因此,对于我的下面的数据,对于每个巢[' (组),最后一个状态'进入将等于命运'为那个巢。

这样的数据:

 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)

我必须从上面提到的资源中遗漏一些简单的东西?

2 个答案:

答案 0 :(得分: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 :(得分: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:做了一个快速的改变。