`data.table` в R - создание столбцов и использование функций - PullRequest
0 голосов
/ 15 апреля 2020

Мне часто приходится вычислять процентное соотношение запаздывающих изменений, и мне было интересно, как можно упростить мой нынешний подход?

В настоящее время я создаю два новых столбца в моих данных - в каждом из вновь созданных столбцов я рассчитывал процентное изменение по сравнению с предыдущим годом, используя функцию lag. Я предпочитаю продолжать работать в data.table, так как мои данные будут довольно большими, и я считаю, что нестандартная оценка намного проще, чем в dplyr. Во всяком случае, ниже мои (пример) данные.

Как можно использовать функцию внутри таблицы данных.таблицы (не повторяйте это так много)?

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) , "%")}

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете указать столбцы, к которым вы хотите применить функцию, в .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%
...