【问题标题】:Compare group of two columns and return index matches R比较两列的组并返回索引匹配 R
【发布时间】:2017-05-23 10:56:41
【问题描述】:

非常感谢您的阅读。抱歉,我确信这是一项简单的任务。

我有一个数据框: (已编辑:添加了不包含在比较中的额外列)

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

我怎样才能实现上述目标?

【问题讨论】:

    标签: r dataframe compare


    【解决方案1】:

    你可以做这样的事情。它根据 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
    

    【讨论】:

    • 如何指定列名? IE。如果有其他 2 个名称不同的列?
    • 这将适用于任意数量的列,前提是 df 仅包含名称列。列的名称无关紧要。或者,如果您只想比较特定的一对列,则可以将 df[,c("e","f")] 替换为 df
    • 理想情况下,我只想保留那些匹配的对,而不是只返回 1 行。是否可以自动删除长度为 1 的元素?
    • 使用duplist &lt;- duplist[sapply(duplist,length)&gt;1] 只保留匹配多个匹配项的那些。您也可以按编号引用列表元素,因此duplist[[1]]2 6names(duplist[1])(注意单个 [])也将是 "alan edd"
    • 谢谢。这将起作用。我非常感谢您的回答和帮助。祝你有美好的一天:)
    猜你喜欢
    • 2016-12-23
    • 2012-05-09
    • 1970-01-01
    • 2015-11-30
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多