我试图使用dplyr来变异包含变量的相同组滞后的列以及其他组(一个)的滞后 . 编辑:对不起,在第一版中,我通过在最后一秒按日期重新排列来搞砸了订单 .
这就是我想要的结果:
这是一个最小的代码示例:
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))
非常感谢你!
4 回答
data.table的解决方案:
other_lag确定的解释:对于每个观察,想法是查看组值,如果存在与当前组不同的任何组值,则在当前组之前,然后取最后一个值,否则,放置NA .
N.B.:
other_lag
可以在不需要data.table的情况下创建:另一个类似@ Cath's的数据表:
这假定A和B是唯一的组 . 如果有更多......
这个怎么运作:
:=
创建一个新列DT[, col := ..., by=]
每个by=
组分别执行每个赋值,基本上作为循环 .循环的当前迭代的分组值位于命名列表
.BY
中 .循环的当前迭代使用的数据子集是data.table
.SD
.x[!i, on=]
是一个反连接,在x
中查找i
的行并返回x
并删除匹配的行 .x[i, on=, roll=TRUE, x.v]
......使用
on=
条件在x
中查找i
的每一行如果找不到完全匹配的
on=
,它"rolls"到最后on=
列的最接近的前一个值它从
x
表返回v
有关更多详细信息和直觉,请查看键入
library(data.table)
时显示的启动消息 .我不完全确定我是否正确地得到了你的问题,但如果“拥有”和“其他”指的是A组和B组,那么这可能会成功 . 我强烈认为有更优雅的方法可以做到这一点:
试试这个:(仅管道方法)
对不起这个烂摊子 . 它的作用是它首先创建一个组滞后并为该组等于其滞后时的情况创建一个辅助变量(即当两个“A”后续时 . 然后它按此辅助变量分组并分配给所有值为dupLag == F正确的值 . 现在我们需要处理dupLag == T.
所以,取消组合 . 我们需要一个新的滞后值助手,它将所有dupLag == T分配给NA,因为它们尚未正确分配 .
接下来是我们在助手中为所有NA分配最后一个非NA值 . 这不是全部,因为我们仍然需要处理一些dupLag == F数据点(当你查看完整的tibble时你会得到它) . 首先,我们基本上只使用第一个mutate更改第二个数据点(otherLag == ... operation . 下一个操作完成所有操作然后我们选择最后我们想要的变量 .