2014-09-06 110 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