【问题标题】:Combining two columns in a data frame and creating a new column in an existing data frame in R组合数据框中的两列并在 R 中的现有数据框中创建新列
【发布时间】:2014-05-28 00:10:09
【问题描述】:

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

有什么想法吗?我查看了合并和堆栈函数,但我认为这些不是解决方法?

【问题讨论】:

  • 你的第 6 行正确吗? 6N-2009-NA。为什么是北美?
  • 这只是我正在处理的现实问题的一个例子。在某些表中存在 NA 值,即使在另一个表中存在相同 ID 的实际值。
  • 带有6N 的ID 在最终的主data.frame 中应该是“紫色”,尽管df2 具有6N/purple 组合。
  • 而4D只有白色
  • 好吧,你不应该在那里任意添加值。您应该提供准确的预期输出。

标签: r dataframe


【解决方案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

【讨论】:

    【解决方案2】:

    这是另一种选择。
    1,我的方法是先组合 df1 和 df2 然后使用 complete.cases 删除那些颜色为 NA 的
    2、然后将master与新的df3合并。 (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
    

    干杯。

    【讨论】:

      【解决方案3】:

      您还可以使用sqldf 包,将df1df2 数据帧按行组合起来:

      *假设与上述示例相同的输入(例如,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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2018-09-04
        • 2022-09-30
        • 1970-01-01
        • 2020-01-01
        • 2020-11-13
        • 1970-01-01
        相关资源
        最近更新 更多