【问题标题】:How do I sum two matrices or data frames that share only some elements in common using R? [duplicate]如何使用 R 对仅共享某些共同元素的两个矩阵或数据框求和? [复制]
【发布时间】:2017-11-06 22:52:07
【问题描述】:

我有两个大型数据框,我想对它们执行元素操作。就我而言,我想基本上对两个具有部分重叠的列名和行名的矩阵进行矩阵加法。

例如:

A <- matrix(rep(1,4),nrow=2)
colnames(A) <- c("a","b")
rownames(A) <- paste("r", seq(1,2,1), sep="")
B <- matrix(rep(10,4),nrow=2)
colnames(A) <- c("b","c")
rownames(B) <- paste("r", seq(2,3,1), sep="")

A
   a b
r1 1 1
r2 1 1

B
    b  c
r2 10 10
r3 10 10

我想将 A+B 按列名和行名相加得到:

>S
   a  b  c
r1 1  1  0
r2 1 11 10
r3 0 10 10

矩阵(或数据框)中的行名和列名仅部分重叠,因此最终矩阵的维度将与单个矩阵不同。在这个玩具示例中,唯一重叠的单元格是 row:b/col:r2。我将空单元格设为 0。

我可以通过重叠行和列对矩阵进行子集化,然后对子矩阵进行排序和添加,最后通过连接不重叠的位来以非常笨拙的方式做到这一点。我的真实数据是具有约 20,000 行(基因)和约 10,000 列(细胞)的基因表达矩阵。

【问题讨论】:

  • 您的示例给出了错误。请纠正。此外,您的示例与您所展示的不同。
  • 您的代码是matrix(rep(1,9),nrow=3),但显示不同
  • 很抱歉。我修复了示例的代码。

标签: r matrix dataframe merge


【解决方案1】:

我们可以用data.table 做到这一点,这应该是有效的。将matrixes 放在list 中,将matrix 转换为data.table,将行名创建为列('rn'),绑定data.tables(rbindlist(...)),按'rn' 分组获取其他列的sum

library(data.table)
rbindlist(lapply(list(A, B), function(x) setDT(as.data.frame(x), 
 keep.rownames = TRUE)), fill = TRUE)[, lapply(.SD, sum, na.rm = TRUE), by = rn]
#   rn a  b  c
#1: r1 1  1  0
#2: r2 1 11 10
#3: r3 0 10 10

数据

A <- structure(c(1L, 1L, 1L, 1L), .Dim = c(2L, 2L), .Dimnames = list(
c("r1", "r2"), c("a", "b")))

B <- structure(c(10L, 10L, 10L, 10L), .Dim = c(2L, 2L), .Dimnames = list(
c("r2", "r3"), c("b", "c")))

【讨论】:

  • 谢谢。这很好用而且速度非常快,虽然我不知道为什么。通过搜索堆栈交换,我收集到[, lapply(.SD, sum, na.rm = TRUE), by = rn] 采用未命名的数据表列的子集 ('rn'),并按 rn 求和。单行字往往会让我感到困惑。
  • @slackoverflow 你是对的。 SD 是 data.table 的子集。在这里,它将采用按“rn”分组的所有其他列的总和。
猜你喜欢
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2021-03-26
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多