[英]R: Dealing with time mismatches while using data.table
嘿,我正在嘗試從使用ddply過渡到使用data.table,而我已經接近搞清楚了,但我還是需要做一些細微的調整。 以下是我正在嘗試使用玩具數據集的摘要:
假設我有兩周的兩種產品的銷售數據。
x <- structure(list(week = c(1, 1, 2, 3, 1, 2, 2, 3, 4), product = c("a",
"a", "a", "a", "b", "b", "b", "b", "b"), sold = c(10, 15, 20,
25, 30, 35, 40, 45, 50)), .Names = c("week", "product", "sold"
), row.names = c(NA, -9L), class = c("data.table", "data.frame"
), sorted = c("product", "week"))
week product sold
1: 1 a 10
2: 1 a 15
3: 2 a 20
4: 3 a 25
5: 1 b 30
6: 2 b 35
7: 2 b 40
8: 3 b 45
9: 4 b 50
我想找到第j周的產品i的總銷售額,即我在第1周銷售了25件產品。
我使用以下代碼執行此操作:
setDT(x)
setkey(x,product,week)
> x1 <- x[x,sum(sold)]
> x1
product week V1
1: a 1 25
2: a 1 25
3: a 2 20
4: a 3 25
5: b 1 30
6: b 2 75
7: b 2 75
8: b 3 45
9: b 4 50
問題是我不知道如何刪除重復的行,即。 第2行是多余的。 此外,我還想在產品沒有銷售的幾周內加入NA,即。 產品一行4周,價值NA。
我確信這是一個簡單的問題,我知道如何在ddply中執行此操作,但我無法通過搜索找到我想要的內容。 如果有人可以提供幫助或將我鏈接到正確的頁面,如果這是重復的話,那就太好了。
以下是您可以通過獨特的產品和所有周來交叉加入,然后對每個組進行求和。
> x[CJ(unique(product), 1:4), sum(sold), by=.EACHI]
product week V1
1: a 1 25
2: a 2 20
3: a 3 25
4: a 4 NA
5: b 1 30
6: b 2 75
7: b 3 45
8: b 4 50
如果您正在使用data.table version <= 1.9.2
,那么只需刪除by = .EACHI
部分。 這是從下一版本開始的新設計變更(目前在1.9.3開發中實現)。 查看新聞以獲取更多相關信息。
也許重塑是另一種選擇:
require(reshape2); require(data.table)
(dt2 <- dcast.data.table(dt, product ~ week, fun.aggregate = sum, value.var = "sold", fill = NA, drop = FALSE))
# product 1 2 3 4
# 1: a 25 20 25 NA
# 2: b 30 75 45 50
(dt3 <- melt(dt2, id.vars = "product", variable.name = "week", value.name = "sold"))
# product week sold
# 1: a 1 25
# 2: b 1 30
# 3: a 2 20
# 4: b 2 75
# 5: a 3 25
# 6: b 3 45
# 7: a 4 NA
# 8: b 4 50
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.