我正在尝试合并来自多个数据框的信息。假设我有一个名为“master”的主数据框,关于一堆汽车的信息。主数据帧具有所有可能的ID。然后假设我有2个其他数据框,每个数据框都有一些ID和汽车的颜色,但不是全部。我想将汽车的所有颜色与现有主数据框中的ID相对应。
Master df看起来像这样:
id year
4D 2005
5A 2003
7T 1999
8Q 2001
3G 1998
6N 2009
2B 2013
df1看起来像这样:
id color
5A black
7T green
8Q gold
4D white
df2看起来像这样:
id color
5A NA
6N purple
3G NA
2B orange
以下是制作4个数据框的代码:
master <- data.frame(id = c("4D", "5A", "7T", "8Q", "3G", "6N", "2B"), year=c(2005,2003,1999,2001,1998,2009,2013))
df1 <- data.frame(id=c("5A", "7T", "8Q", "4D"), color=c("black", "green", "gold", "white"))
df2 <- data.frame(id=c("5A", "6N", "3G", "2B"), color=c(NA,"purple", NA, "orange"))
我希望最终的主数据框看起来像这样:
id year color
4D 2005 white
5A 2003 black
7T 1999 green
8Q 2001 gold
3G 1998 NA
6N 2009 purple
2B 2013 orange
如果一个数据帧中有值,而另一个数据帧中有相同ID的NA(即:ID 5A在df1中为“黑色”,但在df2中为NA),则该值应存在于电子表格中。
有什么想法?我已经看过了合并和堆栈函数,但我不认为这些是可行的方法吗?
答案 0 :(得分:1)
df <- Master
df1
df2
dft <- rbind(df1, df2)
df3 <- dft[with(dft, order(id, color)), ]
df3 <- df3[!duplicated(df3$color), ]
merge(df, df3, by = 'id', all.x = T)
id year color
1 2B 2013 orange
2 3G 1998 <NA>
3 4D 2005 white
4 5A 2003 black
5 6N 2009 purple
6 7T 1999 green
7 8Q 2001 gold
答案 1 :(得分:1)
这是另一种选择。
1,我的方法是首先将df1和df2组合,然后使用complete.cases
来删除那些颜色为NA
2,然后用新的df3合并master。 (all=TRUE
,确保df3中未包含的ID将显示在合并的data.frame中
df3 <- rbind(df1,df2) #row combine for df1 and df2
df3 <- df3[complete.cases(df3),] #remove row with NA
merge(master, df3, by="id", all=TRUE) #merge master and df3 based on id
结果是
id year color
1 2B 2013 orange
2 3G 1998 <NA>
3 4D 2005 white
4 5A 2003 black
5 6N 2009 purple
6 7T 1999 green
7 8Q 2001 gold
干杯。
答案 2 :(得分:0)
按行组合sqldf
和df1
数据框后,您还可以使用df2
包:
*假设上述示例中的输入相同(例如master
,df1
,df2
的值
> id_color <- rbind(df1, df2)
> library(sqldf)
> data <- sqldf("SELECT m.*, i.color FROM master m, id_color i WHERE m.id = i.id")
> data
id year color
1 4D 2005 white
2 5A 2003 <NA>
3 5A 2003 black
4 7T 1999 green
5 8Q 2001 gold
6 3G 1998 <NA>
7 6N 2009 purple
8 2B 2013 orange
> data <- sqldf("SELECT id, year, MIN(color) FROM data GROUP BY id, year") #removes duplicate with NULL
> data
id year MIN(color)
1 2B 2013 orange
2 3G 1998 <NA>
3 4D 2005 white
4 5A 2003 black
5 6N 2009 purple
6 7T 1999 green
7 8Q 2001 gold