2015-05-23 39 views
2

我在長表的一些數據,看起來像這樣:從長到寬的形式沒有id.var?

dat1 = data.frame(
    id = rep(LETTERS[1:2], each=4), 
    value = 1:8 
) 

在表格形式:

id value 
A 1 
A 2 
A 3 
A 4 
B 5 
B 6 
B 7 
B 8 

,我想這是在短期形式是這樣的:

dat1 = data.frame(A = 1:4, B = 5:8) 

以表格形式:

A B 
1 5 
2 6 
3 7 
4 8 

現在我可以通過循環與cbind()和東西來解決這個問題,但我想使用某種類型的重塑/融化函數,因爲這些是我認爲做這種事情的最佳方式。

但是,花費> 30分鐘試圖讓melt()reshape()工作,閱讀SO上的答案,似乎這些功能需要設置id.var。現在,這種事情顯然是多餘的,所以我怎麼做我想做的事情,而不必訴諸某種循環?

回答

3

我很確定這已經回答過。無論如何,unstack與平等組大小這種特殊情況下方便:當有作爲和B的不同數量低於

unstack(dat1, form = value ~ id) 
# A B 
# 1 1 5 
# 2 2 6 
# 3 3 7 
# 4 4 8 
+0

我找不到它。我發現的所有答案和指南都假設會使用id.var。我只是堆疊了沒有id.var的數據。當然,我可以給他們一個合適的id.var,例如'rownames(dat1)= rep(1:4,2)',但是這會失去自動執行它的目的。 – Deleet

2

解決方案的工作。對於相同的計數,unstack效果很好,代碼較少(Henrik's答案)。

# create more general data (unbalanced 'id') 
each <- c(4,2,3) 
dat1 = data.frame(
    id = unlist(mapply(rep, x = LETTERS[1:length(each)], each = each)), 
    value = 1:sum(each), 
    row.names = 1:sum(each) # to reproduce original row.names 
) 

tab <- table(dat1$id) 
dat1$timevar <- unlist(sapply(tab, seq)) 
library(reshape2) 
dcast(dat1, timevar ~ id)[-1] 

初始數據:

id value 
1 A  1 
2 A  2 
3 A  3 
4 A  4 
5 B  5 
6 B  6 
7 C  7 
8 C  8 
9 C  9 

結果:

A B C 
1 1 5 7 
2 2 6 8 
3 3 NA 9 
4 4 NA NA 
2

這裏的一個基礎R的方法來考慮。它使用lengths函數,我相信它是在R 3.2中引入的。

x <- split(dat1$value, dat1$id) 
as.data.frame(lapply(x, function(y) `length<-`(y, max(lengths(x))))) 
# A B C 
# 1 1 5 7 
# 2 2 6 8 
# 3 3 NA 9 
# 4 4 NA NA