簡體   English   中英

R - 將data.frame轉換為多維矩陣

[英]R - convert data.frame to multi-dimensional matrix

來自data.frame的示例:

x = data.frame(c(1,1,2,2,3,3), c(1,2,1,2,1,2), c(1,1,1,2,2,2), c(12,14,22,24,34,28))
colnames(x)=c("Store","Dept","Year","Sales")

我想獲得:

Sales = array(NA, dim=c(2,2,2)) 

銷售是3維的數組:(存儲,部門,年)填充了來自x的所有數據。

我正在尋找一個可擴展到更多維度的解決方案,以及初始數據框(x)中的數千條記錄。


編輯:我認為下面的解決方案是有效的,但似乎它們並不完全是我想要的。 我認為問題是索引在這個過程中丟失了。

這是一個小數據集:

    structure(list(Store = c(35L, 35L, 35L, 35L, 35L), Dept = c(71L, 
71L, 71L, 71L, 71L), Year = c(1, 2, 3, 4, 5), Sales = c(10908.04, 
12279.99, 11061.82, 12288.1, 9950.55)), .Names = c("Store", "Dept", 
"Year", "Sales"), row.names = c(NA, -5L), class = "data.frame")


    > x
  Store Dept Year    Sales
1    35   71    1 10908.04
2    35   71    2 12279.99
3    35   71    3 11061.82
4    35   71    4 12288.10
5    35   71    5  9950.55

現在我希望能夠致電Sales [35,71,2]獲得10908.04。

下面的兩個解決方案都通過調用Sales [1,1,1]來獲取數據,此時我無法使用它。

就像是 :

tapply(X = x[["Sales"]], INDEX = x[setdiff(names(x), "Sales")], FUN = identity)

可以工作,但使用身份函數tapply有點奇怪。

你是在尋找xtabs嗎?

xtabs(Sales ~ Store + Dept + Year, x)
# , , Year = 1
# 
#      Dept
# Store  1  2
#     1 12 14
#     2 22  0
#     3  0  0
# 
# , , Year = 2
# 
#      Dept
# Store  1  2
#     1  0  0
#     2  0 24
#     3 34 28

您必須使用適當的維度構造數組:

Sales <- array(NA, c(max(x$Store), max(x$Dept), max(x$Year)))

然后填寫數據:

for (i in 1:nrow(x)) 
    Sales[x[i,"Store"], x[i,"Dept"], x[i,"Year"]] <- x[i, "Sales"]

Sales[35,71,1]

暫無
暫無

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

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