我试图将矩阵的第一行与同一矩阵的所有行进行比较。但是矢量化比较并没有返回正确的结果。任何可能发生这种情况的原因?
m <- matrix(c(1,2,3,1,2,4), nrow=2, ncol=3, byrow=TRUE)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 2 4
> # Why does the first row not have 3 TRUE values?
> m[1,] == m
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] FALSE FALSE FALSE
> m[1,] == m[1,]
[1] TRUE TRUE TRUE
> m[1,] == m[2,]
[1] TRUE TRUE FALSE
后续即可。在我的实际数据中,我有大量的行(至少1000万)然后时间和内存加起来。以下建议的其他建议由其他人提出?
m <- matrix(rep(c(1,2,3), 1000000), ncol=3, byrow=TRUE)
> #by @alexis_laz
> m1 <- matrix(m[1,], nrow = nrow(m), ncol = ncol(m), byrow = T)
> system.time(m == m1)
user system elapsed
0.21 0.03 0.31
> object.size(m1)
24000112 bytes
> #by @PaulHiemstra
> system.time( t(apply(m, 1, function(x) x == m[1,])) )
user system elapsed
35.18 0.08 36.04
后续行动2 。 @alexis_laz你是对的。我想比较每一行,并在其上发布了一个后续问题(How to vectorize comparing each row of matrix with all other rows)
答案 0 :(得分:4)
在比较m[1,] == m
中,第一个词m[1,]
被循环使用(一次),等于m的长度。然后按列完成比较。
您将c(1,2,3)
与c(1,1,2,2,3,4)
进行比较,将c(1,2,3,1,2,3)
与c(1,1,2,2,3,3,4)
进行比较,这样您就有一个TRUE
后跟五个FALSE
(和打包为矩阵以匹配m
)的维度。
答案 1 :(得分:2)
正如@MatthewLundberg指出的那样,R的回收规则并不像你预期的那样。在我看来,明确说明要比较什么并且不依赖于R的假设总是更好。一种做出正确比较的方法:
t(apply(m, 1, function(x) x == m[1,]))
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE FALSE
或:
m == rbind(m[1,], m[1,])
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE FALSE
或让R的recyling对你有利(感谢@Arun):
t(t(m) == m[1,])
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE FALSE