gpt4 book ai didi

r - 不同组的 dplyr 滞后

转载 作者:行者123 更新时间:2023-12-02 23:33:49 25 4
gpt4 key购买 nike

我正在尝试使用 dplyr 来改变包含变量的同一组滞后的列以及其他组(之一)的滞后。编辑:抱歉,在第一版中,我在最后一秒按日期重新排列,有点搞乱了顺序。

Original df

这就是我想要的结果:

Desired Outcome df这是一个最小的代码示例:

library(tidyverse)

set.seed(2)
df <-
data.frame(
x = sample(seq(as.Date('2000/01/01'), as.Date('2015/01/01'), by="day"), 10),
group = sample(c("A","B"),10,replace = T),
value = sample(1:10,size=10)
) %>% arrange(x)

df <- df %>%
group_by(group) %>%
mutate(own_lag = lag(value))


df %>% data.frame(other_lag = c(NA,1,2,7,7,9,10,10,8,6))

非常感谢!

最佳答案

解决方案 :

library(data.table)

# to create own lag:
setDT(df)[, own_lag:=c(NA, head(value, -1)), by=group]

# to create other group lag: (the function works actually outside of data.table, in base R, see N.B. below)
df[, other_lag:=sapply(1:.N,
function(ind) {
gp_cur <- group[ind]
if(any(group[1:ind]!=gp_cur)) tail(value[1:ind][group[1:ind]!=gp_cur], 1) else NA
})]

df
# x group value own_lag other_lag
#1: 2001-12-08 B 1 NA NA
#2: 2002-07-09 A 2 NA 1
#3: 2002-10-10 B 7 1 2
#4: 2007-01-04 A 5 2 7
#5: 2008-03-27 A 9 5 7
#6: 2008-08-06 B 10 7 9
#7: 2010-07-15 A 4 9 10
#8: 2012-06-27 A 8 4 10
#9: 2014-02-21 B 6 10 8
#10: 2014-02-24 A 3 8 6

other_lag确定的解释:这个想法是,对于每个观察,查看组值,如果有任何组值与当前组值不同,前一个组值与当前组值不同,则取最后一个值值,否则,输入 NA。

注意: other_lag 可以在不需要 data.table 的情况下创建:

df$other_lag <- with(df, sapply(1:nrow(df), 
function(ind) {
gp_cur <- group[ind]
if(any(group[1:ind]!=gp_cur)) tail(value[1:ind][group[1:ind]!=gp_cur], 1) else NA
}))

关于r - 不同组的 dplyr 滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49898126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com