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