从合并的数据框中删除重复项,同时将重复项保留在原始数据集中

Remove duplicates from merged dataframe while keeping duplicates within original datasets

我有多个使用 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)

这应该有效:

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)