比较两列的组并返回索引匹配R.

时间:2017-05-23 10:56:41

标签: r dataframe compare

非常感谢阅读。为我所确定的事情道歉是一项简单的任务。

我有一个数据帧: (编辑:添加额外的列不包括在比较中)

b = c(5, 6, 7, 8, 10, 11) 
c = c('david','alan','pete', 'ben', 'richard', 'edd') 
d = c('alex','edd','ben','pete','raymond', 'alan')
df = data.frame(b, c, d) 
df
   b       c       d
1  5   david    alex
2  6    alan     edd
3  7    pete     ben
4  8     ben    pete
5 10 richard raymond
6 11     edd    alan

我想将列组cd与列dc列进行比较。也就是说,对于一行,我想将cd中的组合值与dc中所有其他行的组合值进行比较。

(注意值可以是字符或整数)

在这些匹配的地方,我想返回匹配的那些行的索引,最好是列表。我需要能够访问索引而不参考列cd中的值。

即。对于上面的数据帧,我的预期输出将是:

c(c(2, 6), c(3, 4))
((2,6), (3,4))

如:

Row 2: (c + d == alan + edd) = row 6: (d + c == edd + alan)
Row 3: (c + d == pete + ben) = row 4: (d + c == ben + pete)

我了解如何使用match melt确定两个单独列的匹配大小写,但如果它们连接在一起并迭代所有可能的行组合,则不会。

我想象的是:

lapply(1:6, function(x), ifelse((df$a & df$b) == (df$b & df$a), index(x), 0))

但显然这是不正确的,并且不会起作用。

我咨询了以下问题,但未能提出答案。我不知道从哪里开始。

Matching multiple columns on different data frames and getting other column as result

match two columns with two other columns

Comparing two columns in a data frame across many rows

R Comparing each value of all pairs of columns

我如何实现上述目标?

1 个答案:

答案 0 :(得分:4)

你可以这样做。它根据从df列形成的唯一排序字符串拆分行索引1:nrow(df)。排序可确保A,BB,A的处理方式相同。

duplist <- split(1:nrow(df),apply(df,1,function(r) paste(sort(r),collapse=" ")))

duplist
$`alan edd`
[1] 2 6

$`alex david`
[1] 1

$`ben pete`
[1] 3 4

$`raymond richard`
[1] 5