【问题标题】:Comparing pairs of rows and remove duplicate information if conditions are met in R如果在 R 中满足条件,则比较行对并删除重复信息
【发布时间】:2017-03-15 18:22:25
【问题描述】:

我对 R 很陌生,我无法为以下问题提出适当的解决方案。我有一个如下所示的数据框:

mydf <- data.frame(group1 = c("A", "B", "C", "C", "B", "A"),
                   group2 = c("B", "A", "A", "B", "C", "C"),
                   value = c(22, 22, 75, 84, 84, 75))
mydf

我想基本上比较每对行并删除那些带有冗余信息的行,即如果 group1[row_n] 等于 group2[row_m] 并且 group2[row_n] 等于 group1[row_m] 和value[row_n] 等于 value[row_m]。在示例中,最终数据框应如下所示:

final.df <- data.frame(group1 = c("A","C", "C"), 
                       group2 = c("B", "A", "B"), 
                       value = c(22, 84, 75))
final.df

希望有人可以提供帮助。提前致谢。

【问题讨论】:

  • unique(mydf)?
  • 我认为unique(mydf) 不会起作用,因为第 1 组和第 2 组被视为可互换。

标签: r rows


【解决方案1】:

您可以使用apply,然后像这样删除重复项:

df <- data.frame(t(apply(mydf,1,sort)))
final.df <- df[!duplicated(df),]

【讨论】:

  • 谢谢@Lucy 非常巧妙的解决方案!
  • 如果 group 和 value 列曾经有类似的项目,这可能会出现问题
  • 你能举一个@andrew问题的例子吗?
  • @Rijak mydf &lt;- data.frame(group1 = c("A", "B"), group2 = c("B", "C"), value = c("C", "A"))
  • @andrew 这是一个很好的观点 - 如果您有组(例如演示的那些)和一些数值,这主要适用。 @d.b我实际上认为您的可能有点危险-在给出的示例中碰巧只有重复的值,但是如果您有一行属于同一组但具有不同的值,则您希望将其包含在内作为单独的行(例如,如果更新为 mydf &lt;- data.frame(group1 = c("A", "B", "C", "C", "B", "A","A"), group2 = c("B", "A", "A", "B", "C", "C","C"), value = c(22, 22, 75, 84, 84, 75, 90)),它将删除 value = 90 的行。
【解决方案2】:

您可以使用dplyr 轻松做到这一点:

library(dplyr)
my.df.ord <- mydf %>%
             group_by(group1, group2) %>%
             mutate(gr.min = min(as.character(group1), as.character(group2)),
                    gr.max = max(as.character(group1), as.character(group2))) %>%
             ungroup() %>%
             select(gr.min, gr.max, value) %>%
             unique()

as.character 是必需的,因为您的 group1group2 显示为因子。

【讨论】:

    猜你喜欢
    • 2023-02-15
    • 2015-10-13
    • 1970-01-01
    • 2020-09-11
    • 2017-09-27
    • 2020-09-08
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多