【问题标题】:Remove duplicates where values are swapped across 2 columns in R [duplicate]删除在 R 中的 2 列之间交换值的重复项 [重复]
【发布时间】:2016-12-03 14:34:35
【问题描述】:

我有一个像这样的简单数据框:

| id1 | id2 | location   | comment   |
|-----|-----|------------|-----------|
| 1   | 2   | Alaska     | cold      |
| 2   | 1   | Alaska     | freezing! |
| 3   | 4   | California | nice      |
| 4   | 5   | Kansas     | boring    |
| 9   | 10  | Alaska     | cold      |

前两行是重复的,因为 id1id2 都去了阿拉斯加。他们的评论不同并不重要。

如何删除这些重复项之一 - 删除任何一个都可以。

我首先尝试对id1id2 进行排序,然后获取它们重复的索引,然后返回并使用索引对原始df 进行子集化。但我似乎无法做到这一点。

df <- data.frame(id1 = c(1,2,3,4,9), id2 = c(2,1,4,5,10), location=c('Alaska', 'Alaska', 'California', 'Kansas', 'Alaska'), comment=c('cold', 'freezing!', 'nice', 'boring', 'cold'))

【问题讨论】:

    标签: r dataframe duplicates


    【解决方案1】:

    我们可以使用applyMARGIN=1sort 按行作为'id' 列,cbind 和'location' 然后使用duplicated 得到一个可用于删除/保留的逻辑索引行。

    df[!duplicated(data.frame(t(apply(df[1:2], 1, sort)), df$location)),]
    #   id1 id2   location comment
    #1   1   2     Alaska    cold
    #3   3   4 California    nice
    #4   4   5     Kansas  boring
    #5   9  10     Alaska    cold
    

    【讨论】:

    • 如果我的“真实”数据框有 6 个与 location 类似的其他列,我该怎么办:值是什么并不重要(但我想保留它们) .我可以像 c(df$location, df$col6, df$col7, df$col8) 一样传递它们吗?
    • @MonicaHeddneck 您可以像df[c("location", "col6", "col7", "col8")] 一样对数据集进行子集化,如果您也在复制中使用它,duplicated(cbind(t(apply(....), df[c("location",...)]))
    • 我很困惑......对不起!您的解决方案没有cbind。我不确定我明白你的意思。我只想随身携带所有其余的柱子。
    • @MonicaHeddneck 而不是cbind 我使用了data.frame
    • 那么你认为这行得通吗? df[!duplicated(data.frame(t(apply(df[1:2], 1, sort)), c(df$location, df$othercol1, df$othercol2))),]?
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多