非常感谢阅读。为我所确定的事情道歉是一项简单的任务。
我有一个数据帧: (编辑:添加额外的列不包括在比较中)
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
我想将列组c
和d
与列d
和c
列进行比较。也就是说,对于一行,我想将c
和d
中的组合值与d
和c
中所有其他行的组合值进行比较。
(注意值可以是字符或整数)
在这些匹配的地方,我想返回匹配的那些行的索引,最好是列表。我需要能够访问索引而不参考列c
或d
中的值。
即。对于上面的数据帧,我的预期输出将是:
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
我如何实现上述目标?
答案 0 :(得分:4)
你可以这样做。它根据从df列形成的唯一排序字符串拆分行索引1:nrow(df)
。排序可确保A,B
和B,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