簡體   English   中英

如何將data.frame轉換為(平面)矩陣?

[英]How to convert data.frame to (flat) matrix?

如何將下面的data.frame轉換為給定的矩陣? data.frame的前兩列包含行變量,其他列的所有組合(包含值的列除外)確定列。 理想情況下,我正在尋找不需要進一步包裝的解決方案(因此不需要 reshape2解決方案)。 另外,沒有ftable解決方案。

(df <- data.frame(c1=rep(c(1, 2), each=8), c2=rep(c(1, 2, 1, 2), each=4),
                  gr=rep(c(1, 2), 8), subgr=rep(c(1,2), 4, each=2), val=1:16) )

c1 c2 gr1.subgr1 gr1.subgr2 gr2.subgr1 gr2.subgr2
1  1   1          3          2          4
1  2   5          7          6          8
2  1   9         11         10         12
2  2  13         15         14         16

使用交互變量構造組:

newdf <- reshape(df, idvar=1:2, direction="wide", 
            timevar=interaction(df$gr,df$subgr) , 
            v.names="val", 
            drop=c("gr","subgr") ) 
names(newdf)[3:6] <- c("gr1.subgr1", "gr1.subgr2", "gr2.subgr1",  "gr2.subgr2")
 newdf
   c1 c2 gr1.subgr1 gr1.subgr2 gr2.subgr1 gr2.subgr2
1   1  1          1          2          3          4
5   1  2          5          6          7          8
9   2  1          9         10         11         12
13  2  2         13         14         15         16

好吧-這看起來似乎可以滿足您的所有需求。 通過閱讀幫助文件,這似乎可以滿足您的要求:

reshape(df, idvar = c("c1", "c2"), timevar = c("gr", "subgr")
        , direction = "wide")
   c1 c2 val.c(1, 2, 1, 2) val.c(1, 1, 2, 2)
1   1  1                NA                NA
5   1  2                NA                NA
9   2  1                NA                NA
13  2  2                NA                NA

我無法完全解釋為什么它會顯示NA值。 但是,幫助頁面上的以下內容可能說明:

timevar 
the variable in long format that differentiates multiple records from the same 
group or individual. If more than one record matches, the first will be taken.

最初,我的意思是,如果您給它指定的列名有歧義,R將使用它的部分匹配功能,但也許不是嗎? 接下來,我嘗試將grsubgr合並到一個列中:

df$newcol <- with(df, paste("gr.", gr, "subgr.", subgr, sep = ""))

讓我們再試一次:

reshape(df, idvar = c("c1", "c2"), timevar = "newcol"
        , direction = "wide", drop= c("gr","subgr"))

   c1 c2 val.gr.1subgr.1 val.gr.2subgr.1 val.gr.1subgr.2 val.gr.2subgr.2
1   1  1               1               2               3               4
5   1  2               5               6               7               8
9   2  1               9              10              11              12
13  2  2              13              14              15              16

快點! 我無法解釋或弄清楚如何使其不附加val. 列名稱,但我將由您自己解決。 我確定它在幫助頁面上的某個位置。 它還將組的排列順序與您請求的順序不同,但是數據似乎正確。

FWIW,這是reshape2的解決方案

> dcast(c1 + c2 ~ gr + subgr, data = df, value.var = "val")
  c1 c2 1_1 1_2 2_1 2_2
1  1  1   1   3   2   4
2  1  2   5   7   6   8
3  2  1   9  11  10  12
4  2  2  13  15  14  16

雖然您仍然必須清理列名。

暫無
暫無

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

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