r - 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) , "%")}
解决方案
您可以指定要在其中应用函数的列.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%
推荐阅读
- java - 使用流删除所有文件和子目录,但不删除 java 中的目录本身
- python - 构建 CNN 时出现 PyTorch 错误:“仅支持 1 批空间目标(3D 张量),但目标大小为:: [1, 2, 64, 64]”
- asp.net - 在 GitHub 操作期间运行 Dotnet 测试未连接到数据库
- ubuntu - 无法从命令行登录 Heroku 帐户
- aggregate - Tableau 计数具有该字段最大值的记录数
- java - 已导入“slf4j-api”和“slf4j-simple”时,如何解决“未找到 SLF4J 提供程序”?
- javascript - CORS:对预检请求的响应未通过访问控制检查 - 如何在 localhost 上解决它?
- javascript - 与高度相比如何设置宽度比?
- php - 如何在 Laravel 8 中使用 foreach 保存多选数据?
- networking - PCAP4J 发送和监控 TCP/UDP 数据包