我想在每个组中找到lead()和lag()元素,但是有一些错误的结果.
例如,数据是这样的:
library(dplyr)
df = data.frame(name=rep(c('Al','Jen'),3),
score=rep(c(100, 80, 60),2))
df
Run Code Online (Sandbox Code Playgroud)
数据:
name score
1 Al 100
2 Jen 80
3 Al 60
4 Jen 100
5 Al 80
6 Jen 60
Run Code Online (Sandbox Code Playgroud)
现在我试着找出每个人的lead()和lag()得分.如果我使用arrange()对其进行排序,我可以得到正确的答案:
df %>%
arrange(name) %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
Run Code Online (Sandbox Code Playgroud)
OUTPUT1:
Source: local data frame [6 x 4]
Groups: name
name score next.score before.score
1 Al 100 60 NA
2 Al 60 80 100
3 Al 80 NA 60
4 Jen 80 100 NA
5 …Run Code Online (Sandbox Code Playgroud) 注意:此问题的标题已经过编辑,使其成为plyr功能掩盖其dplyr对应项时的问题的规范问题.问题的其余部分保持不变.
假设我有以下数据:
dfx <- data.frame(
group = c(rep('A', 8), rep('B', 15), rep('C', 6)),
sex = sample(c("M", "F"), size = 29, replace = TRUE),
age = runif(n = 29, min = 18, max = 54)
)
Run Code Online (Sandbox Code Playgroud)
有了旧的,plyr我可以使用以下代码创建一个总结我的数据的小表:
require(plyr)
ddply(dfx, .(group, sex), summarize,
mean = round(mean(age), 2),
sd = round(sd(age), 2))
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
group sex mean sd
1 A F 49.68 5.68
2 A M 32.21 6.27
3 B F 31.87 9.80
4 B M 37.54 …Run Code Online (Sandbox Code Playgroud) 我想在一个组中创建一个包含上一年变量值的变量.
id date value
1 1 1992 4.1
2 1 NA 4.5
3 1 1991 3.3
4 1 1990 5.3
5 1 1994 3.0
6 2 1992 3.2
7 2 1991 5.2
Run Code Online (Sandbox Code Playgroud)
value_lagged当组中缺少前一年时应该丢失 - 要么是因为它是组内的第一个日期(如第4,7行),要么是因为数据中存在年份缺口(如第5行).此外,value_lagged当缺少当前时间时应丢失(如第2行).
这给出了:
id date value value_lagged
1 1 1992 4.1 3.3
2 1 NA 4.5 NA
3 1 1991 3.3 5.3
4 1 1990 5.3 NA
5 1 1994 3.0 NA
6 2 1992 3.2 5.2
7 2 1991 5.2 NA
Run Code Online (Sandbox Code Playgroud)
现在,在R中,我使用data.table …
真的很沮丧.我只想区分data.table中的行.其中dif(n)=值(n) - 值(n-1).所以,与我的相比,结果应该移动1个位置,每个"变量"的第一个位置应该是NA.即dif应为(NA,4,-2,NA,1,-8).每个"变量的第一个值应该是NA,因为没有位置n-1.任何想法如何修改函数来实现这个?我真的想知道如何为了我自己的理解而使用rollapplyr来做这个.
谢谢.
data.table:
> dt
variable value
1: xyz 3
2: xyz 7
3: xyz 5
4: abc 9
5: abc 10
6: abc 2
> dt[,dif := rollapplyr(value, 2, function(x){r <- diff(x,lag = 1)}, align = "right"), by = list(variable)]
> dt
variable value dif
1: xyz 3 4
2: xyz 7 -2
3: xyz 5 4
4: abc 9 1
5: abc 10 -8
6: abc 2 1
Run Code Online (Sandbox Code Playgroud) 这个问题类似于一次在data.table中创建一堆滞后变量以及如何在每个组中创建滞后变量?,但据我所知,并不完全相同.
我想创造一些领先的变量,例如lead1,lead2和lead3下面,通过分组groups.
示例数据
require(data.table)
set.seed(1)
data <- data.table(time =c(1:10,1:8),groups = c(rep(c("a","b"),c(10,8))),
value = rnorm(18))
data
time groups value
1: 1 a -0.62645381
2: 2 a 0.18364332
3: 3 a -0.83562861
4: 4 a 1.59528080
5: 5 a 0.32950777
6: 6 a -0.82046838
7: 7 a 0.48742905
8: 8 a 0.73832471
9: 9 a 0.57578135
10: 10 a -0.30538839
11: 1 b 1.51178117
12: 2 b 0.38984324
13: 3 …Run Code Online (Sandbox Code Playgroud)