【问题标题】:Make two columns from one column covering all combinations从涵盖所有组合的一列中创建两列
【发布时间】:2013-03-09 10:01:16
【问题描述】:

这似乎是一个简单的问题,但让我很头疼(这不是功课,而是实际研究中的症结所在)

我有一个包含 2266 个级别的列表。该列表看起来有点像这样:

[1] ~/folder1/folder1/a.bin
[2] ~/folder1/folder1/b.bin
[3] ~/folder1/folder1/c.bin
[4] ~/folder1/folder2/a.bin
[5] ~/folder1/folder2/b.bin
[6] ~/folder1/folder2/c.bin

解释一下:列表是我使用readBin 函数读取的二进制文件的文件名。我想将每一行与其他每一行进行比较,所以我想要的是两列,其中包含从我的单列派生的所有唯一组合

(choose 2266,2) 告诉我,我们的单列有 2566245 种组合成两列。

`expand.grid() 似乎让我走到了一半。但是我需要的组合是我需要的四倍:我得到两行,每行 5132490。这意味着存在重复:1 + 2 和 2 + 1 对我的目的来说是相同的。

expand.grid.dfunique=TRUE 似乎也没有帮助。

我的最后一个想法是 md5 对 500 万行中的每一行进行哈希处理,并尝试以这种方式检测重复项。

我正在寻找一些方法来制作两个列表,涵盖我列表的 2566245 个组合。或者以某种方式删除所有重复项。 我想我并不是绝对喜欢使用 R 并且已经研究过 awk 或 sed 来做同样的事情。不过还没有成功。

【问题讨论】:

  • 你试过combn(all_files, 2)吗?
  • 我也试过combn。我可以再试一次...
  • combn(all_files, 2) 不起作用(甚至没有关闭)。
  • 你能详细说明一下doesn't work吗?
  • 您在上面显示的 6 个文件中获得了多少种组合?

标签: r combinatorics


【解决方案1】:

我认为您正在寻找 combn 看起来像 expand.grid,使用 @Arun 数据,

v <- c("~/folder1/folder1/a.bin", 
       "~/folder1/folder1/b.bin", 
       "~/folder1/folder1/c.bin", 
       "~/folder1/folder2/a.bin", 
       "~/folder1/folder2/b.bin", 
       "~/folder1/folder2/c.bin")
do.call(rbind,combn(v,2,simplify=F))

    [,1]                      [,2]                     
 [1,] "~/folder1/folder1/a.bin" "~/folder1/folder1/b.bin"
 [2,] "~/folder1/folder1/a.bin" "~/folder1/folder1/c.bin"
 [3,] "~/folder1/folder1/a.bin" "~/folder1/folder2/a.bin"
 [4,] "~/folder1/folder1/a.bin" "~/folder1/folder2/b.bin"
 [5,] "~/folder1/folder1/a.bin" "~/folder1/folder2/c.bin"
 [6,] "~/folder1/folder1/b.bin" "~/folder1/folder1/c.bin"
 [7,] "~/folder1/folder1/b.bin" "~/folder1/folder2/a.bin"
 [8,] "~/folder1/folder1/b.bin" "~/folder1/folder2/b.bin"
 [9,] "~/folder1/folder1/b.bin" "~/folder1/folder2/c.bin"
[10,] "~/folder1/folder1/c.bin" "~/folder1/folder2/a.bin"
[11,] "~/folder1/folder1/c.bin" "~/folder1/folder2/b.bin"
[12,] "~/folder1/folder1/c.bin" "~/folder1/folder2/c.bin"
[13,] "~/folder1/folder2/a.bin" "~/folder1/folder2/b.bin"
[14,] "~/folder1/folder2/a.bin" "~/folder1/folder2/c.bin"
[15,] "~/folder1/folder2/b.bin" "~/folder1/folder2/c.bin"

编辑

我认为路径格式过度使问题复杂化。如果我们使用例如字母代替文件名,我们会得到:

do.call(rbind,combn(letters[1:4],2,simplify=F))
     [,1] [,2]
[1,] "a"  "b" 
[2,] "a"  "c" 
[3,] "a"  "d" 
[4,] "b"  "c" 
[5,] "b"  "d" 
[6,] "c"  "d"  

所以如你所见,没有重复。

【讨论】:

  • 我的文件名的前 6 个看起来不错。只是用他们所有人测试它。手指交叉。
  • 这似乎是我需要的一半。现在有两行,每行总计 2566245。这意味着存在重复。将文件 A 与 B 和 B 与 A 进行比较对我来说是一回事。
  • @RSoul 我更新了我的问题,你能用我的例子解释一下我错过了什么吗?
  • 也许我很困惑。感谢您的澄清。我会调查的。
  • 我会在接受您的答案之前对其进行测试,但我相信您是正确的,并且您的答案确实符合我的要求。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多