从合并的数据框中删除重复项,同时将重复项保留在原始数据集中
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)
我有多个使用 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)