2017-05-23 77 views
2

非常感谢您的阅读。我相信道歉是一项简单的任务。比较两列的组和返回索引匹配R

我有一个数据框: (编辑:增加了额外的列不列入比较)

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中的值。

I.e.对于上述数据框中,我的预期输出是:

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) 

我知道如何确定匹配的情况下使用matchmelt两个单独的列,但如果它们连接在一起并遍历所有可能的行组合。

我设想是这样的:

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

我怎样才能实现上述?

回答

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 
+0

如何指定列名?即如果有另外两个不同名称的列? – Chuck

+0

这将适用于任意数量的列,只要df仅由名称列组成。列的名称无关紧要。如果你只想比较一对特定的列,或者你可以用'df [,c(“e”,“f”)]'代替'df'。 –

+0

理想情况下,我想只保留那些有匹配的对,而不是仅当返回1行时。是否可以自动删除长度为1的元素? – Chuck

相关问题