【问题标题】:Merging data frames with missing values in R在 R 中合并具有缺失值的数据帧
【发布时间】:2011-08-17 19:59:39
【问题描述】:

获取数据帧的代码:

rat_all = structure(list(frequency = c(37L, 31L, 14L, 11L, 2L, 3L), isoforms = 8:13,      
    type = structure(c("rat_all", "rat_all", "rat_all", "rat_all",              
    "rat_all", "rat_all"), .Dim = c(6L, 1L))), .Names = c("frequency",          
"isoforms", "type"), row.names = 8:13, class = "data.frame")

rat_ensembl = structure(list(frequency = c(17L, 8L, 20L), isoforms = 8:10,                    
    type = structure(c("rat_ensembl", "rat_ensembl", "rat_ensembl"              
    ), .Dim = c(3L, 1L))), .Names = c("frequency", "isoforms",                  
"type"), row.names = 8:10, class = "data.frame") 

我有两个数据框:

  frequency isoforms        type                                               
8         17        8 rat_ensembl                                               
9          8        9 rat_ensembl                                               
10        20       10 rat_ensembl  

   frequency isoforms    type                                                   
8         37        8 rat_all                                                   
9         31        9 rat_all                                                   
10        14       10 rat_all                                                   
11        11       11 rat_all                                                   
12         2       12 rat_all                                                   
13         3       13 rat_all   

我想将这些组合成一个数据框,但也包括缺失的 isoforms 出现在 rat_all 数据框中但不在 rat_ensembl 中的条目 数据框。所以我希望输出是一个组合数据框,就像我 rbinded 两个数据框,但增加了:

11         0       11 rat_ensembl
12         0       12 rat_ensembl
13         0       13 rat_ensembl

我以为我可以通过合并来做到这一点,但我最终得到了一个巨大的混乱,我必须解开,我最终可以按摩成正确的格式,但如果这不是一个好的解决方案 我想一次为四五个不同的“类型”做这个。我错过了什么?谢谢!

明确地说,我希望得到一个看起来像这样的最终数据框:

      frequency isoforms        type                                               
1         17        8 rat_ensembl                                               
2          8        9 rat_ensembl                                               
3         20       10 rat_ensembl                                                   
4         37        8 rat_all                                                   
5         31        9 rat_all                                                   
6         14       10 rat_all                                                   
7         11       11 rat_all                                                   
8          2       12 rat_all                                                   
9          3       13 rat_all   
10         0       11 rat_ensembl
11         0       12 rat_ensembl
12         0       13 rat_ensembl

如果我使用它,我可以让它做我想做的事:

z = merge(rat_ensembl, rat_all, by.x="isoforms", by.y="isoforms", all.y=TRUE)
   isoforms frequency.x      type.x frequency.y  type.y                         
7         7          44 rat_ensembl          69 rat_all                         
8         8          17 rat_ensembl          37 rat_all                         
9         9           8 rat_ensembl          31 rat_all                         
10       10          20 rat_ensembl          14 rat_all                         
11       11          NA        <NA>          11 rat_all                         
12       12          NA        <NA>           2 rat_all                         
13       13          NA        <NA>           3 rat_all                         
14       14          NA        <NA>           1 rat_all            

然后,理论上我可以选择isoformsfrequency.xtype.x 列和 修复它们,使它们对 rat_ensemblrat_allrbind 中的每一个都是正确的 数据框在一起,但似乎应该有一些东西可以直接处理它。

【问题讨论】:

  • 你对合并有什么尝试?您要合并的常用列是什么?频率、异构体、类型?上述所有的?一旦确定了公共列,就可以通过指定“所有”参数来指定是否需要内连接、左连接、右连接或外连接。另外,您能否使用人们可以粘贴到他们的 R 会话中的代码 sn-p 来更新您的问题?使用dput() 并将内容粘贴到您的问题中。
  • 感谢 dput 的建议,非常有帮助。我在帖子中添加了额外的信息。

标签: r merge dataframe


【解决方案1】:

也许你想要这样的东西

z <- merge(rat_ensembl, rat_all, all = TRUE)

iso_diff <- setdiff(rat_all$isoforms, rat_ensembl$isoforms)

augmented <- data.frame(frequency = 0, isoforms = iso_diff, type = "rat_ensembl", stringsAsFactors= FALSE)

df_all <- rbind(z, augmented)

希望对您有所帮助。

【讨论】:

  • 嗨,Iselzer,这似乎给我的结果与将两个数据帧绑定在一起的结果相同。我正在寻找某种方法来增加其中一个数据帧中缺少的一些数据。我更新了我的帖子,使其更加清晰。谢谢!
  • @rory,我刚刚升级了我的 anwser 以包含您真正想要的内容。我不知道是否有更简单的方法。如果有人知道,请发布。
  • 感谢 Iselzer,setdiff 函数对我来说是一个新函数。我认为这个解决方案对我有用,但只有在我确定所有差异都归因于一个条件时才有效。不过,就我而言,情况就是这样。谢谢!
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 2020-03-08
  • 2019-09-15
  • 2015-10-29
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多