矩阵和数据框之间的逐行差异

标签 r dataframe matrix apply

我有 2 个对象:m1 是行数随时间增加的矩阵,m2 是行数随时间减少的数据框。两者共享共同的列名(即行、列)。我想要的是找到 m1 的第一行和 m2 的每一行之间的区别,并将输出作为一个对象存储在列表中。对于 m1 的后续行,这应该继续。

我已经尝试使用 apply(m1, 1, function(x){x - m2}),但这给了我一个我无法解释的结果(即,差异没有意义从第二次观察开始)。为什么会发生这种情况?可以采取哪些措施来确保按要求返回差异?

数据、代码和当前输出:

m1 <- matrix(1:4, ncol = 2, byrow = T) 
m2 <- data.frame(matrix(1:10, ncol = 2, byrow = T))
colnames(m1) <- colnames(m2) <- c("row", "col")

> m1
     row col
[1,]   1   2
[2,]   3   4
> m2
  row col
1   1   2
2   3   4
3   5   6
4   7   8
5   9  10
> apply(m1, 1, function(x){x - m2})
[[1]]
  row col
1   0   0
2  -1  -3
3  -4  -4
4  -5  -7
5  -8  -8

[[2]]
  row col
1   2   2
2   1  -1
3  -2  -2
4  -3  -5
5  -6  -6

期望的输出:

[[1]]
  row col
1   0   0
2  -2  -2
3  -4  -4
4  -6  -6
5  -8  -8

[[2]]
  row col
1   2   2
2   0   0
3  -2  -2
4  -4  -4
5  -6  -6

最佳答案

我们可以试试下面的代码

apply(
  m1,
  1,
  function(x) {
    t(x - t(m2))
  },
  simplify = FALSE
)

给出

[[1]]
     row col
[1,]   0   0
[2,]  -2  -2
[3,]  -4  -4
[4,]  -6  -6
[5,]  -8  -8

[[2]]
     row col
[1,]   2   2
[2,]   0   0
[3,]  -2  -2
[4,]  -4  -4
[5,]  -6  -6

或者,另一个选项使用 Map + split + rep

Map(
  `-`,
  split(m1[rep(1:nrow(m1), each = nrow(m2)), ], gl(nrow(m1), nrow(m2))),
  list(m2)
)

给出

$`1`
  row col
1   0   0
2  -2  -2
3  -4  -4
4  -6  -6
5  -8  -8

$`2`
  row col
1   2   2
2   0   0
3  -2  -2
4  -4  -4
5  -6  -6

关于矩阵和数据框之间的逐行差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71213235/

相关文章:

r - 创建表达式测试,看看 R 中的 `as.formula(' X ~ 1')` 是否包含截距?

r - 将星号添加到 p 值

在 R 中按组记录连续天数

matrix - 递归 lisp 替换元素迷宫求解器

ruby - 如何对二维数组求和

python - 在 Python 中为大型数据集创建邻接矩阵

r - 控制箭头的数量

Scala 通过表达式向数据框添加新列

python - 在 Jupyter Python Notebook 中显示所有数据框列

r - 将字符列转换为因子是否可以节省内存?