簡體   English   中英

R data.table 中按組計算的產品

[英]Product calculation by group in R data.table

我目前正在轉換數據集以獲取數據表中每個先前觀察結果的乘積。 這是在 excel 中很容易實現的東西,但我正在努力在 data.table 中找到非遞歸解決方案。 簡短形式的數據,ID 在真實數據中有數千個級別和每個 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 
')

您可以使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM