首页 > 解决方案 > R中的`data.table` - 创建列和使用函数

问题描述

我经常发现自己需要计算事物的滞后百分比变化,并且想知道如何简化我目前的方法?

目前,我正在我的数据中创建两个新列 - 在每个新创建的列中,我使用函数计算了与上一年相比的百分比变化lag。我更喜欢继续工作data.table,因为我的数据会非常大,而且对我来说,非标准评估比 in 更直接dplyr。无论如何,下面是我的(示例)数据。

该函数如何在 data.table 中使用(不要重复我自己)?

year <- c(2012, 2013, 2014, 2015)
value <- c (22,33,44,55)
amount <- c(99, 88, 77, 66)

mydata <- cbind(year, value, amount)
mydata <- as.data.table(mydata)

getPctLag(mydata$value)

mydata <- mydata[ , ':=' (value_pct = paste0(round((value/lag(value) - 1) * 100, digits = 3) , " %"),
                          amount_pct = paste0(round((amount/lag(amount) - 1) * 100, digits = 3) , " %"))]

getPctLag <- function(x){lag_pct = paste0(round((x/lag(x) - 1) * 100, digits = 3) , "%")}

标签: rfunctiondata.tablelag

解决方案


您可以指定要在其中应用函数的列.SDcols。另外,由于您正在使用data.table它,因此最好使用它,shift因为lag它来自dplyr.

library(data.table)

getPctLag <- function(x)  paste(round((x/shift(x) - 1) * 100, digits = 3) , "%")
cols <- c("value", "amount")

mydata[, paste0(cols, "pct") := lapply(.SD, getPctLag), .SDcols = cols]
mydata

#   year value amount value_pct amount_pct
#1: 2012    22     99       NA%        NA%
#2: 2013    33     88       50%   -11.111%
#3: 2014    44     77   33.333%     -12.5%
#4: 2015    55     66       25%   -14.286%

推荐阅读