R将数据帧/删除行与条件组合
我有两个数据帧,它们的列与我的相同 我想合并。如果df1和df2的“ID”列中的任何值相同 我只想保留df1的对应行(在中没有重复的值) 此列在df1或df2中)。 举个例子: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=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重新分配更改后的数据