为什么表达式移位(.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
答案 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