R - 删除具有相同值的行和具有相同值组合的行

Posted

技术标签:

【中文标题】R - 删除具有相同值的行和具有相同值组合的行【英文标题】:R - Remove rows with same values AND rows with same combinations of values 【发布时间】:2021-09-12 01:09:18 【问题描述】:

我有一些看起来像这样的数据:

Row  From   To      Value
1    MA1007 MA1007  2
2    MA1007 MA2801  1
3    MA2801 MA1017  1
4    MA1051 MA2066  2
5    MA1051 MA2059  1
6    MA2066 MA1051  2
7    MA2066 MA2066  1

我想删除 FromTo 列中值相同的所有行。在上面的示例中,这意味着将删除第 1 行和第 7 行。但是,我还想删除FromTo 列中的值组合出现多次的任何行(仅保留该行的一个实例)。例如,将删除第 2 行或第 3 行(它们都包含相同的“MA”代码组合,尽管在不同的列中)。第 4 行或第 6 行也将被删除。如果有任何区别,Value 列对于特定组合也将具有相同的值。例如。第 2 行和第 3 行具有相同的值,第 4 行和第 6 行也是如此。

这是最终数据的外观:

Row  From   To      Value
2    MA1007 MA2801  1
4    MA1051 MA2066  2
5    MA1051 MA2059  1

关于我应该如何处理这个问题有什么想法吗?谢谢:)

【问题讨论】:

【参考方案1】:

我们可以使用subset 创建一个表达式,其中“From”值不等于 (!=) 到 'To' 和 (&) 不等于 (!) duplicated 'From', 'To', 在sorting 之后与pmin/pmax逐行匹配

subset(df1, From != To & !duplicated(cbind(pmin(From, To), pmax(From, To))))

-输出

 Row   From     To Value
2   2 MA1017 MA2801     1
4   4 MA1051 MA2066     2
5   5 MA1051 MA2059     1

数据

df1 <- structure(list(Row = 1:7, From = c("MA1007", "MA1017", "MA2801", 
"MA1051", "MA1051", "MA2066", "MA2066"), To = c("MA1007", "MA2801", 
"MA1017", "MA2066", "MA2059", "MA1051", "MA2066"), Value = c(2L, 
1L, 1L, 2L, 1L, 2L, 1L)), class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

完美运行。感谢您提供另一个解决方案:) 绝妙的方式。我认为这比使用igraph 更直接。点赞!【参考方案2】:

igraph 选项使用 simplify + graph_from_data_frame + get.data.frame

merge(
    setNames(get.data.frame(
        simplify(
            graph_from_data_frame(df[-1], directed = FALSE),
            edge.attr.comb = "mean"
        )
    ), names(df)[-1]),
    df
)

给予

    From     To Value Row
1 MA1017 MA2801     1   2
2 MA1051 MA2059     1   5
3 MA1051 MA2066     2   4

【讨论】:

以上是关于R - 删除具有相同值的行和具有相同值组合的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中删除具有几个相同值的行?

SQLITE3 - 删除具有相同值的多个列的行

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项

如何删除R中两列中具有相同值但ID不同的行[重复]

聚合具有两个或多个具有相同值的列的行

使用java在sql中查找具有相同数据的具有相同值的行?