【问题标题】:Using rbind to merge data frames使用 rbind 合并数据帧
【发布时间】:2013-12-01 17:54:24
【问题描述】:

我有 2 个尺寸为 2 x 5 的数据框 A 和 B,如下所示:

 A = data.frame(GeneA1=-0.02:1.89, GeneB2=0.25:1.99, GeneB3=0.17:1.87, GeneB4=0.3:1.63, GeneC2=0.29:1.97, row.names=c("sample 1", "sample 2"))

 B = data.frame(GeneA1=0.52:-0.04, GeneB1=1.1:0.08, GeneB3=0.72:0.03, GeneB5=0.78:0.06, GeneC2=0.78:0.25, row.names=c("sample 1", "sample 2"))    

对于 A 和 B,行是样本,列是基因类型

我想尝试使用 rbind 合并 A 和 B,在基因类型不匹配的地方添加 NAs。我听说有一种方法可以做到这一点,使用 setdiff 参数,但我不知道怎么做?

【问题讨论】:

  • 能否提供可重现的示例数据?
  • “可重现”是什么意思?我提供的示例数据说明了我的问题?
  • 请在您的代码中使用 R 语法。你展示的可能是 Matlab 代码?
  • 关于在 SO 上发布的仅供参考的信息和可重复的示例可以在此处查看 link。你看过merge()
  • 对不起!我已经编辑了我的帖子,所以它现在有 R 代码

标签: r


【解决方案1】:

使用merge

> AB <- merge(A, B, all=TRUE)
> AB[,order(names(AB))]  # to get the result ordered by colnames 
  Gene A1 Gene B1 Gene B2 Gene B3 Gene B4 Gene B5 Gene C2
1   -0.04    0.08      NA    0.03      NA    0.06    0.25
2   -0.02      NA    0.25    0.17    0.30      NA    0.29
3    0.52    1.10      NA    0.72      NA    0.78    0.78
4    1.89      NA    1.99    1.87    1.63      NA    1.97

其中A和B分别如下:

A <- matrix(c(-0.02, 0.25, 0.17, 0.3, 0.29, 
              1.89, 1.99, 1.87, 1.63, 1.97), 
            nrow=2, byrow=TRUE,
            dimnames=list(NULL, c("Gene A1", "Gene B2", 
                                  "Gene B3", 
                                  "Gene B4", "Gene C2")))

B <- matrix(c(0.52, 1.1, 0.72, 0.78, 0.78, 
              -0.04, 0.08, 0.03, 0.06,0.25), 
            nrow=2, byrow=TRUE,
            dimnames=list(NULL, c("Gene A1", "Gene B1",
                                  "Gene B3", 
                                  "Gene B5", "Gene C2")))

【讨论】:

  • 我尝试过使用合并,但是当我在更大的数据帧上执行此操作时,我经常遇到错误消息:“match.names(clabs, names(xi)) 中的错误:名称不匹配以前的名称”所以我想知道是否有办法使用 rbind 来做到这一点?
  • @Jilber “默认情况下,数据框会合并到它们都拥有的名称的列上”。因此,如果两个数据框在共享列上具有相同的值,它们会被合并吗?将1.89, 999, 1.87, 999, 1.97 行添加到A 和B,以查看它的实际效果。
【解决方案2】:

可以使用merge函数:

A=data.frame(A1=c(-0.02,1.89),B2=c(0.25,1.99),B3=c(0.17,1.87),B4=c(0.3,1.63),C2=c(0.29,1.97))
B=data.frame(A1=c(0.52,-0.04),B1=c(1.1,0.08),B3=c(0.72,0.03),B5=c(0.78,0.06),C2=c(0.78,0.25))
C<-merge(A, B, all=T)
View(C)

【讨论】:

  • 查看我对 Jilber 回答的评论。
  • @Marie-Anne Frenken 你的答案和我的有什么区别??这只是重复的答案吗?
【解决方案3】:

试试这个:

# dummy data
A <- read.table(text="
Gene A1, Gene B2, Gene B3, Gene B4, Gene C2
0.52, 0.25, 0.17, 0.3, 0.29
1.89, 1.99, 1.87, 1.63, 1.97",
                sep=",", header=TRUE)
B <- read.table(text="
Gene A1, Gene B1, Gene B3, Gene B5, Gene C2
0.52, 1.1, 0.72, 0.78, 0.78
-0.04, 0.08, 0.03, 0.06,0.25",
                sep=",", header=TRUE)

#transpose and merge
tAB <- merge(t(A),t(B),by="row.names",all=TRUE)

#keep gene names
col <- tAB[,1]

#exclude rownames, transpose
output <- t(tAB[,-1])

#update colnames
colnames(output) <- col

#output
#     Gene.A1 Gene.B1 Gene.B2 Gene.B3 Gene.B4 Gene.B5 Gene.C2
#V1.x   -0.02      NA    0.25    0.17    0.30      NA    0.29
#V2.x    1.89      NA    1.99    1.87    1.63      NA    1.97
#V1.y    0.52    1.10      NA    0.72      NA    0.78    0.78
#V2.y   -0.04    0.08      NA    0.03      NA    0.06    0.25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多