使用分组数据,我想更改一列中的最后一个条目,以匹配另一列中该组的相应值。因此,对于我的下面的数据,对于每个巢[' (组),最后一个状态'进入将等于命运'为那个巢。
这样的数据:
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 :(得分: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:做了一个快速的改变。