R将数据帧/删除行与条件组合

R将数据帧/删除行与条件组合,r,dataframe,R,Dataframe,我有两个数据帧,它们的列与我的相同 我想合并。如果df1和df2的“ID”列中的任何值相同 我只想保留df1的对应行(在中没有重复的值) 此列在df1或df2中)。 举个例子: df1=data.frame(ID=c("id10", "id11", "id3", "id5", "id8", "id40", "id47", "id9"),

我有两个数据帧,它们的列与我的相同 我想合并。如果df1和df2的“ID”列中的任何值相同 我只想保留df1的对应行(在中没有重复的值) 此列在df1或df2中)。 举个例子:

df1=data.frame(ID=c("id10", "id11", "id3", "id5", "id8", "id40", "id47", "id9"),
               Var1 = c(rep("A", 3), rep("B", 3), rep(NA, 2)),
               Var2 = c(rep("yes",4),rep("no", 4)))

df2=data.frame(ID=c("id3", "id4","id8", "id20", "id32"),
               Var1 = c(rep("A", 2), rep("B", 2), rep(NA, 1)),
               Var2 = c(rep("yes",4),rep("no", 1)))


>df1
  ID Var1 Var2
1 id10    A  yes
2 id11    A  yes
3  id3    A  yes
4  id5    B  yes
5  id8    B   no
6 id40    B   no
7 id47 <NA>   no
8  id9 <NA>   no

>df2
ID Var1 Var2
1  id3    A  yes
2  id4    A  yes
3  id8    B  yes
4 id20    B  yes
5 id32 <NA>   no

df1=data.frame(ID=c(“id10”、“id11”、“id3”、“id5”、“id8”、“id40”、“id47”、“id9”),
Var1=c(代表(“A”,3),代表(“B”,3),代表(NA,2)),
Var2=c(代表(“是”,4),代表(“否”,4)))
df2=data.frame(ID=c(“id3”、“id4”、“id8”、“id20”、“id32”),
Var1=c(代表(“A”,2),代表(“B”,2),代表(NA,1)),
Var2=c(代表(“是”,4),代表(“否”,1)))
>df1
ID Var1 Var2
1 id10 A是的
2 id11 A是的
3 id3 A是
4 id5 B是
5 id8 B号
6 id40 B号
7 id47号
8 id9号
>df2
ID Var1 Var2
1 id3 A是
2 id4 A是
3 id8 B是
4 id20 B是的
5 id32号
我正在寻找的输出:


> df_res
     ID Var1 Var2
1  id10    A  yes
2  id11    A  yes
3   id3    A  yes
4   id5    B  yes
5   id8    B   no
6  id40    B   no
7  id47 <NA>   no
8   id9 <NA>   no
9   id4    A  yes       #edited
10 id20    B  yes
11 id32 <NA>   no


>df_res
ID Var1 Var2
1 id10 A是的
2 id11 A是的
3 id3 A是
4 id5 B是
5 id8 B号
6 id40 B号
7 id47号
8 id9号
9 id4 A是#已编辑
10 id20 B是的
11 id32号
所以我想用df1更新df2。例如,“id8”出现在两个dfs中,但df_res只有df1中的一个,并放弃了df2中的条目,而df2和df1中的所有唯一id值仍然存在。
如何实现这一点?

如果两个数据集每个ID只有一行,一个选项是将它们与
bind_行
绑定,按“ID”分组,并对第一行进行切片

library(dplyr)
bind_rows(df1, df2) %>%
    group_by(ID) %>% 
    slice(1)

或者
dplyr
当前版本(
>1.0.0
)中的另一个选项是
rows\u upsert

rows_upsert(df1, df2, by = "ID")

如果两个数据集每个ID只有一行,则可以选择将它们与
bind_行
绑定,按“ID”和
slice对第一行进行分组

library(dplyr)
bind_rows(df1, df2) %>%
    group_by(ID) %>% 
    slice(1)

或者
dplyr
当前版本(
>1.0.0
)中的另一个选项是
rows\u upsert

rows_upsert(df1, df2, by = "ID")

希望
unique
+
rbind
能有所帮助

> unique(rbind(df1, df2))
     ID Var1 Var2
1  id10    A  yes
2  id11    A  yes
3   id3    A  yes
4   id5    B  yes
5   id8    B   no
6  id40    B   no
7  id47 <NA>   no
8   id9 <NA>   no
10  id4    A  yes
11  id8    B  yes
12 id20    B  yes
13 id32 <NA>   no
>唯一(rbind(df1,df2))
ID Var1 Var2
1 id10 A是的
2 id11 A是的
3 id3 A是
4 id5 B是
5 id8 B号
6 id40 B号
7 id47号
8 id9号
10 id4 A是
11 id8 B是的
12 id20 B是的
13 id32号

希望
独特的
+
rbind
能有所帮助

> unique(rbind(df1, df2))
     ID Var1 Var2
1  id10    A  yes
2  id11    A  yes
3   id3    A  yes
4   id5    B  yes
5   id8    B   no
6  id40    B   no
7  id47 <NA>   no
8   id9 <NA>   no
10  id4    A  yes
11  id8    B  yes
12 id20    B  yes
13 id32 <NA>   no
>唯一(rbind(df1,df2))
ID Var1 Var2
1 id10 A是的
2 id11 A是的
3 id3 A是
4 id5 B是
5 id8 B号
6 id40 B号
7 id47号
8 id9号
10 id4 A是
11 id8 B是的
12 id20 B是的
13 id32号

您可以将
df1
df2
组合在一起,只保留具有所选
ID
的行

这可以在
dplyr
中完成:

library(dplyr)
bind_rows(df1, df2) %>% distinct(ID, .keep_all = TRUE)

#     ID Var1 Var2
#1  id10    A  yes
#2  id11    A  yes
#3   id3    A  yes
#4   id5    B  yes
#5   id8    B   no
#6  id40    B   no
#7  id47 <NA>   no
#8   id9 <NA>   no
#9   id4    A  yes
#10 id20    B  yes
#11 id32 <NA>   no
和基准R:

df3 <- rbind(df1, df2)
df3[!duplicated(df3$ID), ]

df3您可以将
df1
df2
组合在一起,只保留具有所选
ID
的行

这可以在
dplyr
中完成:

library(dplyr)
bind_rows(df1, df2) %>% distinct(ID, .keep_all = TRUE)

#     ID Var1 Var2
#1  id10    A  yes
#2  id11    A  yes
#3   id3    A  yes
#4   id5    B  yes
#5   id8    B   no
#6  id40    B   no
#7  id47 <NA>   no
#8   id9 <NA>   no
#9   id4    A  yes
#10 id20    B  yes
#11 id32 <NA>   no
和基准R:

df3 <- rbind(df1, df2)
df3[!duplicated(df3$ID), ]

df3在预期输出中,没有“id4”。你能解释一下为什么预期输出中没有“id4”吗。你能解释一下为什么第一个解决方案对我有效吗,谢谢!第二行(rows\u upsert)没有-它为重复的ID保留了错误的行(我使用的是我的原始数据,而不是示例数据)。如果我改为rows_upsert(df2,df1,by=“ID”),我会收到一条警告消息,并且与ID链接的一些变量在输出中变为NA第一个解决方案对我有效,谢谢!第二行(rows\u upsert)没有-它为重复的ID保留了错误的行(我使用的是我的原始数据,而不是示例数据)。如果我改为rows_upsert(df2,df1,by=“ID”),我会收到一条警告消息,并且一些链接到ID的变量在输出中变为NA。前两个解决方案处理我的数据,谢谢。最后一个没有(我在原始数据的df3中得到了重复的ID)您需要为所有解决方案
df4重新分配更改的数据前两个解决方案与我的数据一起工作,谢谢。最后一个没有(在我的原始数据中,我在df3中得到了重复的ID。您需要为所有解决方案
df4重新分配更改后的数据