【问题标题】:Product calculation by group in R data.tableR data.table中按组计算的产品
【发布时间】:2020-03-12 15:01:53
【问题描述】:

我目前正在转换数据集,以获取数据表中每个先前观察的结果。这是在 excel 中很容易实现的东西,但我正在努力在 data.table 中找到一个非递归解决方案。简写形式的数据,ID 在真实数据中还有数千个级别和数千个 x。每个 ID 都有相同数量的 X。

| index | ID | X    |
|-------|----|------|
| 1     | 1  | 0.8  |
| 2     | 1  | 0.75 |
| 3     | 1  | 0.72 |
| 4     | 2  | 0.9  |
| 5     | 2  | 0.5  |
| 6     | 2  | 0.45 |

我想要的结果如下

| index | ID | X    | product |
|-------|----|------|---------|
| 1     | 1  | 0.8  | 0.8     |
| 2     | 1  | 0.75 | 0.6     |
| 3     | 1  | 0.72 | 0.432   |
| 4     | 2  | 0.9  | 0.9     |
| 5     | 2  | 0.5  | 0.45    |
| 6     | 2  | 0.45 | 0.2025  |

其中 product 等于 x 乘以该特定 ID 的所有先前 x 值。这可以在 for 循环中完成,但我正在寻找一种利用 data.table 的解决方案,以便可以在集群上运行。

可重现的数据:

df <- fread('
 index  ID  X    
 1      1   0.8  
 2      1   0.75 
 3      1   0.72 
 4      2   0.9  
 5      2   0.5  
 6      2   0.45 
')

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以使用cumprod

    # If data.table not already loaded, these steps are required first
    # library(data.table)
    # setDT(df)
    
    df[, Xprod := cumprod(X), ID][]
    
    #    index ID    X  Xprod
    # 1:     1  1 0.80 0.8000
    # 2:     2  1 0.75 0.6000
    # 3:     3  1 0.72 0.4320
    # 4:     4  2 0.90 0.9000
    # 5:     5  2 0.50 0.4500
    # 6:     6  2 0.45 0.2025
    

    如果需要应用prod以外的功能,可以使用frollapply。例如,下面的代码给出的结果与上面的代码相同。

    df[, Xprod := frollapply(X, 1:.N, prod, adaptive = TRUE), by = ID]
    

    【讨论】:

    • 只需加载包library(data.table) 并首先将您的data.frame 转换为data.table setDT(df)
    • 更通用一点(使用其他功能)是:df[, sapply(1:.N, function(i) prod(X[1:i])), by = ID]
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2014-06-30
    • 2023-01-25
    • 2023-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多