2014-01-21 163 views
1

我有數據幀在這個格式 -R數據幀格式組

 
ABC 2 
ABC 4 
ABC 6 
DEF 10 
DEF 20 

我怎樣才能得到這個TO-

 
ABC 2 4 6 
DEF 10 20 

我試過aggregate功能,但它需要像均值功能/總和爲參數。我怎麼才能直接在行中顯示值。

+0

如果列長度相同會怎樣? – Harpreet

回答

4
df <- read.table(sep=" ", header=F, text=" 
ABC 2 
ABC 4 
ABC 6 
DEF 10 
DEF 20") 
unstack(df, form=V2~V1) 
# $ABC 
# [1] 2 4 6 
# 
# $DEF 
# [1] 10 20 

unstack在這種情況下產生一個list作爲列不具有相同的長度。在長度相同的情況下:

df <- read.table(sep=" ", header=F, text=" 
ABC 2 
ABC 4 
ABC 6 
DEF 10 
DEF 20 
DEF 20") 
t(unstack(df, form=V2~V1)) 
#  [,1] [,2] [,3] 
# ABC 2 4 6 
# DEF 10 20 20 
+0

如果色譜柱長度相同會怎樣? – Harpreet

+0

@Harpreet然後'unstack'將返回你想要的轉置(即ABC和DEF是列名)。使用't()'會將它重新設置爲你所需要的。 – lukeA

+0

謝謝,這工作。 – Harpreet

0

你想獲得一個稀疏矩陣嗎?您示例中的兩行具有不同的長度。嘗試函數產生一個列表:

mat<-cbind(
c("ABC","ABC","ABC","DEF","DEF"), 
c(2,4,6,10,20) 
) 

count<-function(mat){ 
    values<-unique(mat[,1]) 
    outlist<-list() 
    for(v in values){ 
     outlist[[v]]<-mat[mat[,1]==v,2] 
    } 
    return(outlist) 
} 
count(mat) 

,這將給你這樣的結果:

$ABC 
[1] "2" "4" "6" 

$DEF 
[1] "10" "20" 
2

嘛,有什麼看法?他們是否想要爲每個類別測量相同的東西?

因爲每個類別的觀察數量都不相同,所以您無法準確獲取與發佈的數據幀完全相同的數據。但是如果你給「DEF」添加一個「NA」,你可以做到這一點。

像這樣:

ABC 2 4 6 
DEF 10 20 NA 

如果這是你想要的,你可以只使用reshape2的dcast

但是你必須命名意見:

library(reshape2) 
df <- data.frame(obs =c(1:3, 1:2), 
       categories = c(rep("ABC", 3), rep("DEF",2)), 
       values=c(2,4,6,10,20), stringsAsFactors=FALSE) 

df2 <- dcast(df, categories~obs) 

df2 
# categories 1 2 3 
# 1  ABC 2 4 6 
# 2  DEF 10 20 NA 
+1

爲'dcast'替代+1。請參閱[我的回答](http://stackoverflow.com/a/21248135/1270695)以獲取「事後」創建「obs」列的方法。 – A5C1D2H2I1M1N2O1R2T1

1

要添加到您的選擇:

這似乎是一個基本的「長廣」重塑的問題,但它缺少一個「時間「變量。這很容易通過使用ave重新創建一個:

ave(as.character(df$V1), df$V1, FUN = seq_along) 
# [1] "1" "2" "3" "1" "2" 
df$time <- ave(as.character(df$V1), df$V1, FUN = seq_along) 

一旦你有一個「時間」變量,使用reshape是非常簡單的:

reshape(df, idvar="V1", timevar="time", direction = "wide") 
# V1 V2.1 V2.2 V2.3 
# 1 ABC 2 4 6 
# 4 DEF 10 20 NA 

相反,如果你想要一個list,沒有需要時間變量。只需使用split

split(df$V2, df$V1) 
# $ABC 
# [1] 2 4 6 
# 
# $DEF 
# [1] 10 20 
# 

同樣,如果你的數據是平衡的,splitrbind可以得到你所需要的。使用@lukeA的樣本數據:

df <- read.table(sep=" ", header=F, text=" 
ABC 2 
ABC 4 
ABC 6 
DEF 10 
DEF 20 
DEF 20") 
do.call(rbind, split(df$V2, df$V1)) 
#  [,1] [,2] [,3] 
# ABC 2 4 6 
# DEF 10 20 20