合并具有不同数字或行的多个数据框

时间:2014-07-14 13:17:27

标签: r

我正在尝试合并两个具有不同行数的数据帧。我只是想显示两个数据帧的头部和尾部,因为它们都有超过一百行。两个数据帧都属于miRNA表达分析,两者都显示如下。两个数据帧仅相差2行。

数据框1(miRNAs_256c)

   miRNA             read_count  precursor  total   seq X256c_norm
1      dre-miR-21      13309   dre-mir-21-2 13309 13309  550709,65
2 dre-miR-181a-5p       1004 dre-mir-181a-1  1004  1004   41544,25
3 dre-miR-181a-5p        927 dre-mir-181a-2   927   927   38358,09
4    dre-miR-181c        592   dre-mir-181c   592   592   24496,21
5    dre-miR-181b        579 dre-mir-181b-2   579   579   23958,29
6    dre-miR-181b        561 dre-mir-181b-1   561   561   23213,47          
160 dre-miR-7149-5p        0   dre-mir-7149     0   0          0
161  dre-miR-723-5p        0    dre-mir-723     0   0          0
162  dre-miR-727-5p        0    dre-mir-727     0   0          0
163     dre-miR-730        0    dre-mir-730     0   0          0
164     dre-miR-735        0    dre-mir-735     0   0          0
165     dre-miR-740        0    dre-mir-740     0   0          0

数据框2(miRNAs_shield)

  miRNA        read_count precursor   total seq shield_norm
1 dre-let-7a        424  dre-let-7a-1   424 424    72939,96
2 dre-let-7a        397  dre-let-7a-6   397 397     68295,2
3 dre-let-7a        371  dre-let-7a-5   371 371    63822,47
4 dre-let-7a        367  dre-let-7a-3   367 367    63134,35
5 dre-miR-21        345  dre-mir-21-2   345 345    59349,73
6 dre-let-7a        343  dre-let-7a-2   343 343    59005,68
162 dre-miR-723-5p    0  dre-mir-723     0   0           0
163 dre-miR-727-5p    0  dre-mir-727     0   0           0
164    dre-miR-730    0  dre-mir-730     0   0           0
165    dre-miR-731    0  dre-mir-731     0   0           0
166    dre-miR-735    0  dre-mir-735     0   0           0
167    dre-miR-740    0  dre-mir-740     0   0           0

我需要合并两者,只保留列的标题,并且我想保留那些读取计数为0的那些。

我尝试了几种方法但没有任何工作正如我所期待的那样。首先我尝试了cbind,但由于行号不同而出错。

prueba <- cbind (miRNAs_256c, miRNAs_shield)

其次,我尝试了markheckmann在http://ryouready.wordpress.com/2009/01/23/r-combining-vectors-or-data-frames-of-unequal-length-into-one-data-frame/

中提出的代码
myList <- list (miRNAs_256c, miRNAs_shield) 
dat <- data.frame ()
for(i in seq(along=myList))for(j in names(myList[[i]]))dat[i,j] <- myList[[i]][j]
dat

此代码在cbind没有错误的情况下运行,但我只能捕获两行。

第三,我尝试了函数merge并且似​​乎工作但我只能捕获34行,而我的数据帧有更多。

dat <- merge (miRNAs_256c, miRNAs_shield, ALL=TRUE)

之后,我尝试了来自join的{​​{1}}函数以及参数plyr的所有值

type

这会合并两个数据帧,但它不会将两者合并,而只是在第一个数据帧的末尾添加第二个数据帧。

dat_join <- join(miRNAs_256c, miRNAs_shield, type = "full")

此变体能够连接两个数据帧,但只能连接miRNAs_256c中的所有行,添加miRNAs_shield的匹配列 dat_join <- join(miRNAs_256c, miRNAs_shield, type = "left") 中的其他值与typeinner相同。

我已经尝试了上面列出的所有可能性,我已经在网上寻求帮助,即使在堆栈溢出,但我无法得到帮助。我不可能将两个数据帧中的所有信息都只存储在一个数据帧中。有人可以提供一些有用的帮助或建议,在哪里可以找到更多的帮助。我已经耗尽了我所知道的所有可能性。

1 个答案:

答案 0 :(得分:1)

我认为你想要进行合并以及你的data.frame是如何相似的有点不清楚。可以在data.frame s中找到相同的miR吗?

无论如何,我首先阅读您提供的数据:

df1 <- read.table(text = "
miRNA             read_count  precursor  total   seq X256c_norm
1      dre-miR-21      13309   dre-mir-21-2 13309 13309  550709,65
2 dre-miR-181a-5p       1004 dre-mir-181a-1  1004  1004   41544,25
3 dre-miR-181a-5p        927 dre-mir-181a-2   927   927   38358,09
4    dre-miR-181c        592   dre-mir-181c   592   592   24496,21
5    dre-miR-181b        579 dre-mir-181b-2   579   579   23958,29
6    dre-miR-181b        561 dre-mir-181b-1   561   561   23213,47          
160 dre-miR-7149-5p        0   dre-mir-7149     0   0          0
161  dre-miR-723-5p        0    dre-mir-723     0   0          0
162  dre-miR-727-5p        0    dre-mir-727     0   0          0
163     dre-miR-730        0    dre-mir-730     0   0          0
164     dre-miR-735        0    dre-mir-735     0   0          0
165     dre-miR-740        0    dre-mir-740     0   0          0")

df2 <- read.table(text = "
miRNA        read_count precursor   total seq shield_norm
1 dre-let-7a        424  dre-let-7a-1   424 424    72939,96
2 dre-let-7a        397  dre-let-7a-6   397 397     68295,2
3 dre-let-7a        371  dre-let-7a-5   371 371    63822,47
4 dre-let-7a        367  dre-let-7a-3   367 367    63134,35
5 dre-miR-21        345  dre-mir-21-2   345 345    59349,73
6 dre-let-7a        343  dre-let-7a-2   343 343    59005,68
162 dre-miR-723-5p    0  dre-mir-723     0   0           0
163 dre-miR-727-5p    0  dre-mir-727     0   0           0
164    dre-miR-730    0  dre-mir-730     0   0           0
165    dre-miR-731    0  dre-mir-731     0   0           0
166    dre-miR-735    0  dre-mir-735     0   0           0
167    dre-miR-740    0  dre-mir-740     0   0           0")

然后我们可以对指定的列进行合并。以下是否符合您的要求?

merge(df1, df2, 
      by = c("miRNA", "read_count", "precursor", "total", "seq"),
      all = TRUE)
#             miRNA read_count      precursor total   seq X256c_norm shield_norm
#1  dre-miR-181a-5p        927 dre-mir-181a-2   927   927   38358,09        <NA>
#2  dre-miR-181a-5p       1004 dre-mir-181a-1  1004  1004   41544,25        <NA>
#3     dre-miR-181b        561 dre-mir-181b-1   561   561   23213,47        <NA>
#4     dre-miR-181b        579 dre-mir-181b-2   579   579   23958,29        <NA>
#5     dre-miR-181c        592   dre-mir-181c   592   592   24496,21        <NA>
#6       dre-miR-21        345   dre-mir-21-2   345   345       <NA>    59349,73
#7       dre-miR-21      13309   dre-mir-21-2 13309 13309  550709,65        <NA>
#8  dre-miR-7149-5p          0   dre-mir-7149     0     0          0        <NA>
#9   dre-miR-723-5p          0    dre-mir-723     0     0          0           0
#10  dre-miR-727-5p          0    dre-mir-727     0     0          0           0
#11     dre-miR-730          0    dre-mir-730     0     0          0           0
#12     dre-miR-735          0    dre-mir-735     0     0          0           0
#13     dre-miR-740          0    dre-mir-740     0     0          0           0
#14      dre-let-7a        343   dre-let-7a-2   343   343       <NA>    59005,68
#15      dre-let-7a        367   dre-let-7a-3   367   367       <NA>    63134,35
#16      dre-let-7a        371   dre-let-7a-5   371   371       <NA>    63822,47
#17      dre-let-7a        397   dre-let-7a-6   397   397       <NA>     68295,2
#18      dre-let-7a        424   dre-let-7a-1   424   424       <NA>    72939,96
#19     dre-miR-731          0    dre-mir-731     0     0       <NA>           0

如您所见,这两个data.frame合并为一个,结果中出现了不同的列shield_normX256c_norm。当信息不可用时,将填充<NA>。正如您所看到的dre-miR-727-5pdf1中存在df2(第10行),因此shield_normX256c_norm中的信息都已填充。

如果这不是您想要的,请您详细说明您的预期输出应该是什么?

编辑。这实际上相当于您(几乎)自己尝试过的内容。但是我可以看到,你用大写写ALL。该参数应该是小写的,因为R区分大小写,所以也许这就是为什么你在reslut中只有34行。