[英]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.