R shift()和diff()

时间:2017-03-18 16:45:34

标签: r data.table

为什么表达式移位(.SD)工作正常,而diff(.SD)导致以下错误:二元运算符的非数字参数?

说明我的观点的一个例子:我需要计算两个变量的第一个差异('value'和'value2')

require(data.table)
df <-data.table(group=rep(c(1,2),each=3),value=c(10,20,25,5,10,15),value2=c(100,200,250,50,100,150))
setkey(df,group)
n1<-c('value','value2')
n2<-paste('d', n1, sep='.')

df[,(n2):=.SD-shift(.SD), by=group,.SDcols=n1] # works fine!
df[,(n2):=diff(.SD), by=group,.SDcols=n1] # produces the error

1 个答案:

答案 0 :(得分:2)

我们需要在diff上应用vector,并且diff的输出也是一个小于向量原始长度的元素。因此,需要与NA或其他感兴趣的元素连接才能使length正确

df[, (n2) := lapply(.SD, function(x) c(NA, diff(x))), by=group,.SDcols=n1]
df
#   group value value2 d.value d.value2
#1:     1    10    100      NA       NA 
#2:     1    20    200      10      100
#3:     1    25    250       5       50
#4:     2     5     50      NA       NA
#5:     2    10    100       5       50
#6:     2    15    150       5       50

注意:此外,shift也可以通过与上述相同的方法应用

df[, (n2) := lapply(.SD, shift), by=group,.SDcols=n1] 
df
#   group value value2 d.value d.value2
#1:     1    10    100      NA       NA
#2:     1    20    200      10      100
#3:     1    25    250      20      200
#4:     2     5     50      NA       NA
#5:     2    10    100       5       50
#6:     2    15    150      10      100