[英]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將使用它的部分匹配功能,但也許不是嗎? 接下來,我嘗試將gr
和subgr
合並到一個列中:
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.