【问题标题】:R dedupe records that are not exactly duplicatesR 不完全重复的重复数据删除记录
【发布时间】:2018-09-18 04:02:29
【问题描述】:

我有一个需要去重的记录列表,这些看起来像是同一组的组合,但是使用常规函数去重记录不起作用,因为两列不重复。下面是一个可重现的例子。

df <- data.frame( A  =  c("2","2","2","43","43","43","331","391","481","490","501","501","501","502","502","502"),

          B =  c("43","501","502","2","501","502","491","496","490","481","2","43","502","2","43","501"))

以下是我正在寻找的所需输出。

df_Final <- data.frame( A  =  c("2","2","2","331","391","481"),

          B =  c("43","501","502","491","496","490"))

【问题讨论】:

  • 您的输入和预期输出之间没有明显的联系。例如,A="43" 条目会发生什么情况?尽管很明显您想要进行重复数据删除,但其背后的逻辑肯定不是直观的,也不是很容易从您的数据中推断出来的。如果您没有明确定义的规则,那么也许可以逐行检查您的输入数据并解释为什么保留或丢弃该行。
  • 决定哪个向量“保留”值的规则是什么?为什么“2”属于A而“43”属于B?

标签: r duplicates data-cleaning


【解决方案1】:

我猜这个想法是你想找到A列中的元素第一次出现在B列中的时间

idx = match(df$A, df$B)

如果A 中的元素不在B (is.na(idx)) 中或A 中的元素在B (seq_along(idx) &lt; idx) 中第一次出现之前出现,则保留该行

df[is.na(idx) | seq_along(idx) < idx,]

也许一种或多或少的文字 tidyverse 方法是创建然后删除一个临时列

library(tidyverse)
df %>% mutate(idx = match(A, B)) %>%
    filter(is.na(idx) | seq_along(idx) < idx) %>%
    select(-idx)

【讨论】:

    【解决方案2】:

    您可以删除在某些重新排序下重复的所有行

    require(dplyr)
    df %>%
        apply(1, sort) %>% t %>% 
        data.frame %>% 
        group_by_all %>% 
        slice(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2013-06-20
      • 2020-11-09
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多