重新排列数据框的列

时间:2014-09-06 17:05:44

标签: r

给定一个数据框,我想重新排列它并返回另一个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

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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