2014-09-06 174 views
0

給定一個數據幀,我想重新排列它並返回2列的另一個數據幀。該數據幀的2列由原始數據幀中的任意2行元素組成。所以我們將在第二個數據幀中有C(ncol,2) * nrow行數。這是一個例子。鑑於數據幀z,我想返回x。我怎樣才能做到這一點?重新排列數據幀的列

> z = data.frame(A = c(1,2,3), B = c(4,5,6), C = c(7,8,9)) 
> z 
    A B C 
1 1 4 7 
2 2 5 8 
3 3 6 9 
> x 
    A B 
1 1 4 
2 1 7 
3 4 7 
4 2 5 
5 2 8 
6 5 8 
7 3 6 
8 3 9 
9 6 9 

回答

1

或者,你可以嘗試:

matrix(apply(z, 1, combn,2), ncol=2, byrow=TRUE) 
#  [,1] [,2] 
#[1,] 1 4 
#[2,] 1 7 
#[3,] 4 7 
#[4,] 2 5 
#[5,] 2 8 
#[6,] 5 8 
#[7,] 3 6 
#[8,] 3 9 
#[9,] 6 9 

要獲得data.frame作爲輸出

setNames(as.data.frame(matrix(apply(z, 1, combn,2), ncol=2, byrow=TRUE)), LETTERS[1:2]) 
0

像這樣的工作

newz <- setNames(do.call(rbind.data.frame, lapply(split(z, 1:nrow(z)), function(x) 
    t(combn(x,2)))), 
c("A","B")) 
newz 

#  A B 
# 1.1 1 4 
# 1.2 1 7 
# 1.3 4 7 
# 2.1 2 5 
# 2.2 2 8 
# 2.3 5 8 
# 3.1 3 6 
# 3.2 3 9 
# 3.3 6 9 

這會生成如果列通過combn()使用所有組合的新行。如果你不喜歡默認的rownames,你可以擺脫他們與

rownames(newz)<-NULL 
newz 
# A B 
# 1 1 4 
# 2 1 7 
# 3 4 7 
# 4 2 5 
# 5 2 8 
# 6 5 8 
# 7 3 6 
# 8 3 9 
# 9 6 9