在R中找到成对的重复列

时间:2014-07-02 05:10:59

标签: r

感谢您查看此帖子。我是R语言的新手。

我想查找一列(未指定一列)是否与另一列重复,并返回一个维数为num.duplicates x 2的矩阵,每行给出任何一对重复变量的索引。矩阵的组织方式使得第一列是该对的较低数字,并且它正在增加有序。

假设我有一个数据集

   v1 v2 v3 v4 v5 v6
1  1  1  2  4  2  1
2  2  2  3  5  3  2
3  3  3  4  6  4  3

我想要这个

      [,1] [,2]
[1,]    1    2
[2,]    1    6
[3,]    2    6
[4,]    3    5

请帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

我想这样的事情:

out <- data.frame(t(combn(1:ncol(dd),2)))
out[combn(1:ncol(dd),2,FUN=function(x) all(dd[x[1]]==dd[x[2]])),]

#   X1 X2
#1   1  2
#5   1  6
#9   2  6
#11  3  5

答案 1 :(得分:0)

我觉得我错过了一些更简单的东西,但这似乎有效。

以下是样本数据。

dd <- data.frame(
    v1 = 1:3, v2 = 1:3, v3 = 2:4, 
    v4 = 4:6, v5 = 2:4, v6 = 1:3
)

现在,我将使用ave()将每个列分配给一个组,以查找重复项。然后我会计算组

中的列数
groups <- ave(1:ncol(dd), as.list(as.data.frame(t(dd))), FUN=min, drop=T)

现在我有了这些组,我会将列索引按这些组拆分,如果有多个组,我会抓住所有成对组合。这将创建一个宽矩阵,我可以按照你想要的t()

将其翻转到一个高位
morethanone <- function(x) length(x)>1
dups <- t(do.call(cbind, 
    lapply(Filter(morethanone, split(1:ncol(dd), groups)), combn, 2)
))

返回

     [,1] [,2]
[1,]    1    2
[2,]    1    6
[3,]    2    6
[4,]    3    5

根据需要

答案 2 :(得分:0)

首先,使用expand.grid生成所有可能的组合。其次,删除重复项并按所需顺序排序。第三,使用sapply查找重复列的索引:

kk <- expand.grid(1:ncol(df), 1:ncol(df))
nn <- kk[kk[, 1] > kk[, 2], 2:1]
nn[sapply(1:nrow(nn), 
         function(i) all(df[, nn[i, 1]] == df[, nn[i, 2]])), ]
   Var2 Var1
2     1    2
6     1    6
12    2    6
17    3    5

我建议的方法是 R-ish ,但我想在这种情况下写一个简单的双循环是合理的,特别是如果你最近开始学习这门语言。