【发布时间】:2017-12-02 02:13:18
【问题描述】:
给定:
test <- data.frame(Participant= c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3),
Day = c(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9),
Value= c(1:30))
我想到达:
test <- data.frame(Participant= c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3),
Day = c(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9),
Value= c(1:30),
LaggedValue= c("NA", 1,2,3,4,5,6,7,8,9, "NA", 11,12,13,14,15,16,17,18,19, "NA", 21,22,23,24,25,26,27,28,29))
我已经尝试了以下方法,它允许我对变量进行时间滞后,但在整个列中都这样做。我想根据 ParticipantID 或 Day 变量进行时间延迟,这样当遇到新的参与者编号或 Day=0 时,时间延迟会返回“NA”:
test$LaggedValue <- c(NA, test$Value[seq_along(test$Value) -1])
我不确定如何添加“if”语句或基于 Participant/Day 变量。 nest() 函数可能在这里工作吗?
【问题讨论】:
-
这个范式就是众所周知的
split-apply-combine。不要试图用 if 语句来破解它。 -
您的数据也是长格式的。如果您转换为宽格式,您可能会发现它更简单、更清晰,即使用
cast/melt()以便(比如说)Participant成为行索引,Day成为列索引(或 v.v.)。那么lag()就变成了直接对列(/行)的简单操作。您可以阅读相关内容。 -
这必须是重复的;
[r] group_by lag有 739 次点击
标签: r group-by split-apply-combine