r语言 - 从合并的数据框中删除重复项,同时保留原始数据集中的重复项



我有多个数据集,我使用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)

相关内容

  • 没有找到相关文章

最新更新