【问题标题】:Rearranging the columns of a data frame [duplicate]重新排列数据框的列[重复]
【发布时间】:2014-09-07 01:20:33
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案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])
    

    【讨论】:

      【解决方案2】:

      这样的事情会起作用

      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(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
      

      【讨论】:

        猜你喜欢
        • 2017-08-03
        • 1970-01-01
        • 2022-06-12
        • 2012-06-19
        相关资源
        最近更新 更多