【问题标题】:Generate as many data frames as permutation of columns生成与列排列一样多的数据帧
【发布时间】:2018-03-18 17:03:10
【问题描述】:

我想生成与我的列的排列数一样多的数据帧,假设一列保持未排列(在所有生成的数据帧中保持相同的索引位置)。这是主要的数据框:

data1 <- data.frame("Alpha"=c(1,2), "Beta"=c(2,2), "Gamma"=c(4,8), "Delta"=c(22,3))
data1
  Alpha Beta Gamma Delta
1     1    2     4    22
2     2    2     8     3

假设第 3 列 (Gamma) 必须保持其位置,对于有限数量的排列,很容易使用列索引并像这样手动排列它们:

data2 <- data1[c(1,4,3,2)]
data2

  Alpha Delta Gamma Beta
1     1    22     4    2
2     2     3     8    2

以此类推,直到达到 4 列中的 3 列的所有排列:

data3 <- data1[c(4,1,3,2)]
data4 <- data1[c(4,2,3,1)]
data5 <- data1[c(2,4,3,1)]
data6 <- data1[c(2,1,3,4)]
data7...

它效率低下,是大型数据集的噩梦。如何在不手动输入所有排列的情况下快速生成所有数据帧?我认为permncombn 很有用,但我无法更进一步。

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。

标签: r dataframe permutation combn


【解决方案1】:

如果您想要第 3 列仍然是第 3 列的所有排列,那么您可以执行以下操作

data1 <- data.frame("Alpha"=c(1,2), "Beta"=c(2,2), "Gamma"=c(4,8), "Delta"=c(22,3))
library(combinat)
idx <- permn(ncol(data1))
idx <- idx[sapply(idx, "[", i = 3) == 3]
res <- lapply(idx, function(x) data1[x])
res 
#R> [[1]]
#R>   Alpha Beta Gamma Delta
#R> 1     1    2     4    22
#R> 2     2    2     8     3
#R> 
#R> [[2]]
#R>   Delta Alpha Gamma Beta
#R> 1    22     1     4    2
#R> 2     3     2     8    2
#R> 
#R> [[3]]
#R>   Alpha Delta Gamma Beta
#R> 1     1    22     4    2
#R> 2     2     3     8    2
#R> 
#R> [[4]]
#R>   Beta Delta Gamma Alpha
#R> 1    2    22     4     1
#R> 2    2     3     8     2
#R> 
#R> [[5]]
#R>   Delta Beta Gamma Alpha
#R> 1    22    2     4     1
#R> 2     3    2     8     2
#R> 
#R> [[6]]
#R>   Beta Alpha Gamma Delta
#R> 1    2     1     4    22
#R> 2    2     2     8     3

更新

如果您希望对象位于名为data2、....、data6 的全局环境中,请调用

names(res) <- paste0("data", 1:length(res))
list2env(res, .GlobalEnv)
data1
#R>   Alpha Beta Gamma Delta
#R> 1     1    2     4    22
#R> 2     2    2     8     3
data2
#R>   Delta Alpha Gamma Beta
#R> 1    22     1     4    2
#R> 2     3     2     8    2
ls() # all the objects in your global enviroment
#R> [1] "data1" "data2" "data3" "data4" "data5" "data6" "idx"   "res"  

【讨论】:

  • 如果我理解正确,idx &lt;- permn(ncol(data1)) 会生成所有排列,idx &lt;- idx[sapply(idx, "[", i = 3) == 3] 只保留 i=3 的排列 idxlapply 部分返回列表。这最后一步并不是我想要的。我需要将结果作为单独的数据框data2data3 等,以便我可以将微积分 R 表分别应用于每个 data.frame。
  • @Elixterra 对于第一部分是的。对于后一部分,请参阅我的更新答案。
  • 更新对应我要找的。现在假设我希望生成的数据帧以某种方式跟踪其名称中的排列顺序。例如,通过使用每个列名的第一个字母:而不是 data1data2,而是使用 dataABGDdataDAGB。它容易实现吗?也许这个问题需要一个新的话题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多