r - 如何使用 for 循环创建和填充列?
问题描述
我有一个包含 10 个变量的简单时间序列数据集 - 我想创建一个 for 循环(或一个函数),为时间序列中的每个变量创建一个“上个月的变化”变量和“上个月变量的百分比变化”(日期除外)。我知道我可以简单地为每个特定列编写代码,但我想优化它,因为有很多列。
这是我的数据的样子,“日期”、“销售”、“价格”是一些列名:
+----+---+---+---+---+---+---+---+--
| Date | Sales | Price |
+----+---+---+---+---+---+---+---+--
| 01Aug2019 | 4 | 15 |
| 01Sept2019 | 6 | 30 |
| 01Oct2019 | 10 | 44 |
+----+---+---+---+---+---+---+---+--
这是我希望它使用 for 循环(或任何函数)时的样子
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Date | Sales | chg_Sales | pct_chg_Sales | Price | chg_Price | pct_chg_Price|
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 01Aug2019 | 4 | NA |NA | 15 | NA |NA |
| 01Sept2019 | 6 | 2 |50% | 30 | 15 |100% |
| 01Oct2019 | 10 | 4 |66% | 44 | 14 |46% |
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
我尝试了下面的代码,但它不起作用
add_column <- function (x, y){
setDT (x)[,pct_chg_y:= (y - shift (y,1, type="lag")/shift (,1, type="lag")*100]
}
解决方案
这是一个选项data.table
,我们在其中指定感兴趣的列,通过从 的ie中减去(Data.table.SDcols
的子集)来创建“chg_”列,然后在第二步中,通过用除以创建“pct_chg ” 'chg_' 列使用.SD
lag
shift
.SD
shift
Map
nm1 <- c("Sales", "Price")
setDT(df1)[, paste0("chg_", nm1) := .SD - shift(.SD), .SDcols = nm1]
df1[, paste0("pct_chg_", nm1) :=
Map(function(x, y) 100 * (y/shift(x)), .SD, mget(paste0("chg_", nm1))),
.SDcols = nm1]
df1
# Date Sales Price chg_Sales chg_Price pct_chg_Sales pct_chg_Price
#1: 01Aug2019 4 15 NA NA NA NA
#2: 01Sept2019 6 30 2 15 50.00000 100.00000
#3: 01Oct2019 10 44 4 14 66.66667 46.66667
数据
df1 <- structure(list(Date = c("01Aug2019", "01Sept2019", "01Oct2019"
), Sales = c(4, 6, 10), Price = c(15, 30, 44)),
class = "data.frame", row.names = c(NA,
-3L))
推荐阅读
- azure-storage - Creating a from an azure logic app not working
- c++ - Undistortion fail in OpenCV
- reactjs - @azure/msal-react 在身份验证后立即调用 .NET Api
- c# - 如何在 C#/ .NET 5 中生成非源文件(例如 json)
- c# - 从扩展的 ListView 覆盖 ContextMenu 样式
- audio - 使用 FFMPEG 从实时流中提取音频帧
- asp.net-mvc - 如何从 .edmx 生成数据库、表、存储过程和视图
- jquery - JQuery中如何只获取点击值对应的id值
- typescript - 如何在 TypeScript 中接受我的函数的通用返回类型?
- position - 如何检索记录?