感谢您查看此帖子。我是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
请帮助,谢谢!
答案 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 ,但我想在这种情况下写一个简单的双循环是合理的,特别是如果你最近开始学习这门语言。