r-在data.table列分配中使用以前定义的列

  • 本文关键字:定义 data table 分配 r data.table
  • 更新时间 :
  • 英文 :


假设我有一个数据表,其中包含一个人的收入工作时间id的信息
我想计算每小时收入iph,然后计算每个人随时间的收入发展(iphd(。

在最后的数据表中,我想存储两个变量iphiphd

data <- data.table(
income = c(100, 120, 140, 205, 200, 220),
hours =  c( 10,  11,  12,  18,  17,  21),
id =     c(  1,   1,   1,   2,   2,   2)
)
(data
[, iph := income / hours]
[, iphd := c(NA, diff(iph)), by = id])[]

由于习惯了基于R的within函数,我想在同一表达式中的定义之后立即访问iph。类似于:

# Trial no. 1
data[,
`:=`(
iph := income / hours,
iphd := c(NA, diff(iph))),
by = id][]
# Trial no. 2
data[, `:=`({
iph = income / hours
iphd = c(NA, diff(iph))
}), by = id][]
# Trial no. 3
data[, .({
iph = income / hours
iphd = c(NA, diff(iph))
}), by = id][]

然而,这些解决方案都不起作用
除了我上面建议的两步方法之外,还有其他方法可以做到这一点吗?

计算{...}和列表中的返回结果

data[, c("iph", "iphd") := {
iph <- income / hours
iphd <- c(NA, diff(iph))
list(iph,iphd)
}, by = id]
#    income hours id      iph       iphd
# 1:    100    10  1 10.00000         NA
# 2:    120    11  1 10.90909  0.9090909
# 3:    140    12  1 11.66667  0.7575758
# 4:    205    18  2 11.38889         NA
# 5:    200    17  2 11.76471  0.3758170
# 6:    220    21  2 10.47619 -1.2885154

不带大括号:

data[, c("iph", "iphd") := list(income / hours, 
c(NA, diff(income / hours))), by = id][]

最新更新