【问题标题】:Remove duplicates from merged dataframe while keeping duplicates within original datasets从合并的数据框中删除重复项,同时在原始数据集中保留重复项
【发布时间】:2021-11-30 02:10:10
【问题描述】:

我有多个使用 rbind 组合的数据集。数据集包含原始 ID,我为每个数据集附加了一个唯一编号(例如,数据集 1 中的所有数据都具有 dfid =1,数据集 1 中的每一行都有一个原始 ID,该 ID 会累积到数据集 2 中的数据。然后 id 值开始再次从 1 开始,但使用 dfid=2)。

数据集包含重复的行,如果它们具有不同的 ID,则应保留这些行,但在其他数据集中也存在重复。我想将重复项保留在数据集中(具有相同的 dfid),但如果它们出现在另一个数据集中(具有不同的 dfid),则应删除该数据集中的重复项。应保留具有最低 dfid 的行,并应删除另一个具有较高 dfid 的数据集中的重复行。

library(tidyverse)
df1= head(iris,3)
df2= tail(iris,3)
df2 =rbind(df2, df1[rep(1), ]) 
df1 =rbind(df1, df1[rep(1), ]) 
df1 =df1%>%mutate(ID=1:nrow(df1)) %>%mutate(dfid=1)
df2 =df2%>%mutate(ID=1:nrow(df2))%>%mutate(dfid=2)

dfexamp =rbind(df1, df2)%>% as.data.frame(row.names = 1:nrow(.))

  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species ID dfid
1          5.1         3.5          1.4         0.2    setosa  1    1
2          4.9         3.0          1.4         0.2    setosa  2    1
3          4.7         3.2          1.3         0.2    setosa  3    1
4          5.1         3.5          1.4         0.2    setosa  4    1
5          6.5         3.0          5.2         2.0 virginica  1    2
6          6.2         3.4          5.4         2.3 virginica  2    2
7          5.9         3.0          5.1         1.8 virginica  3    2
8          5.1         3.5          1.4         0.2    setosa  4    2

而我想要的结果是:

  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species ID dfid
1          5.1         3.5          1.4         0.2    setosa  1    1
2          4.9         3.0          1.4         0.2    setosa  2    1
3          4.7         3.2          1.3         0.2    setosa  3    1
4          5.1         3.5          1.4         0.2    setosa  4    1
5          6.5         3.0          5.2         2.0 virginica  1    2
6          6.2         3.4          5.4         2.3 virginica  2    2
7          5.9         3.0          5.1         1.8 virginica  3    2

我尝试使用 group_by 但这会删除所有重复项,或者只是我想要保留的行(使用 vars(-ID))。

dfexamp %>% group_by_at(vars(-dfid, -ID)) %>% 
  filter(n() < 2)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species      ID  dfid
1          4.9         3            1.4         0.2 setosa        2     1
2          4.7         3.2          1.3         0.2 setosa        3     1
3          6.5         3            5.2         2   virginica     1     2
4          6.2         3.4          5.4         2.3 virginica     2     2
5          5.9         3            5.1         1.8 virginica     3     2

*编辑

我最终使用了:

dfexamp %>%unite(.,key, c(-dfid,-ID), sep=" ", remove= FALSE)%>%
  group_by(key, .add = TRUE) %>% group_split() %>% 
  map(~  .x %>% filter(dfid == min(dfid))) %>% 
  bind_rows(.) %>% 
  select(-key)

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    这应该可行:

    library(tidyverse)
    dfexamp %>% 
      mutate(key = as.integer(
        as.factor(
          apply(.[,names(.) != "dfid"], 1, str_c, collapse = ",")
          )
        )
      ) %>% 
      group_split(key) %>% 
      map(~  .x %>% filter(dfid == min(dfid))) %>% 
      bind_rows(.) %>% 
      select(-key)
    

    【讨论】:

    • 我的初始示例有点过于简单,因为应该从 dfid=2 中删除的行与 dfid=1 中的副本具有相同的 ID。我将更新示例,以便更好地代表我的问题!
    • 不,问一个新问题。您已经接受了对您问题的回答。
    • 这是非常糟糕的礼仪。在提出新问题之前,请重新接受我的回答。
    • 此代码还将处理您在上面的评论中描述的内容。
    • 很抱歉问题是一样的。下次我会更好地计划我的例子。此代码不会为我删除第二个数据集中的重复项。
    猜你喜欢
    • 2019-09-03
    • 2018-07-07
    • 2020-10-11
    • 2023-04-09
    • 1970-01-01
    • 2020-12-23
    • 2012-09-27
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多