r - 如何使用 for 循环创建和填充列?

标签 r for-loop data.table

我有一个包含 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 的选项,我们在 .SDcols 中指定感兴趣的列,通过减去 .SD 创建“chg_”列(Data.table 的子集)来自 lag,即 .SDshift,然后在第二步中,创建 ' pct_chg,通过使用 Map

shift 与“chg_”列分开
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))

关于r - 如何使用 for 循环创建和填充列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903559/

相关文章:

r - 使用 dplyr select() 在 for 循环中生成 ggplot 对象时最终对象出错

javascript - 如何在 jQuery 中循环遍历元素并同时替换

r - 将某一特定列求和为每 2 种和 3 种可能组合中的 n 列

r - 如何在 R 中创建具有相等随机分布的数据子集

R:使用lubridate计算年龄

json - 从列表中逐行构建数据框

java - 循环永远不会开始

替换 data.table 观察;矢量方法

R:当日出/日落时间发生变化时,将日/夜列添加到数据框中

c++ - 如何在 R 对象中存储 CPP 类?