2011-12-15 70 views
0

這可能是一個很瑣碎的問題...我有一個類似的表:如何投射文字?

tbl1 <- data.frame(rbind(
c("N1","G1","a"), 
c("N1","G1","b"), 
c("N1","G2","d"), 
c("N2","G1","e"), 
c("N2","G1","f"), 
c("N2","G2","g") 
)) 

,我想將它轉化成這樣:

X1 | G1   | G2 

N1 | c("a","b") | "d" 

N2 | c("e","f") | "g" 

我想是這樣的要走的方向,但該怎麼做?被設置爲?

tbl2 <- data.frame(cast(tbl1,X1~X2, value="X3", ?)) 

感謝您對Stack Overflow的所有貢獻!

/克里斯

+0

這是不是一個微不足道的問題,因爲你的願望輸出不是數據框。因此,您有兩個選擇:使itna data.frame,其中doubled元素實際上是單個字符元素,或使它成爲一個列表(不一定是矩形)。方便的是,你已經提供瞭解決方案 - 每個解決方案之一。 – 2011-12-15 10:20:56

回答

3

這實際上做你所要求的是什麼,但結果的印刷版本看起來乍一看有點古怪。 (當然,很好地打印它的難點在於,這是一個data.frame,其中一些「cells」是具有多個元素的向量)。

特別是如果你需要這個包含(而不是它產生的打印對象)的信息,它仍然可以爲你的目的只是罰款:

tbl2 <- with(tbl1, 
      tapply(as.character(X3), 
        INDEX = list(X1, X2), 
        FUN = I)) 
# Equivalently: FUN = function(X) X)) 

# Examine the resulting data.frame 
tbl2 
# G1   G2 
# N1 Character,2 "d" 
# N2 Character,2 "g" 

# Extract particular elements 
tbl2[["N1", "G1"]] 
# [1] "a" "b" 

tbl2[["N2", "G2"]] 
# [1] "g" 
4

另一種解決方案

library(reshape2) 
dcast(tbl1, X1 ~ X2, fun.aggregate= function(x) paste(x, collapse = ","))