gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:53:07 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com