组合数据框中的两列并在R中的现有数据框中创建新列

时间:2014-05-28 00:10:09

标签: r dataframe

我正在尝试合并来自多个数据框的信息。假设我有一个名为“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),则该值应存在于电子表格中。

有什么想法?我已经看过了合并和堆栈函数,但我不认为这些是可行的方法吗?

3 个答案:

答案 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)

按行组合sqldfdf1数据框后,您还可以使用df2包:

*假设上述示例中的输入相同(例如masterdf1df2的值

> 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