我有一个类似的矩阵:
m <- matrix(rnorm(100), 100, 50)
我想一行一行地更改所有的值,这样任何一行以上的值(标准偏差(*2都将变为1,否则为0(基本上是一个阈值(。
我试过这样的东西:
cutoff <- function(x){
x[x < 2*sd(x)] <- 0
x[x > 2*sd(x)] <- 1
return(x)
}
mT <- apply(m, 1, cutoff)
但它给了我一些不同的东西。如有任何帮助,我们将不胜感激。
您的代码是正确的,您需要转置结果,因为apply
总是返回转置的结果(请参阅为什么apply((返回转置后的xts矩阵?(。
mT <- t(apply(m, 1, cutoff))
您还可以将cutoff
功能缩减为-
cutoff <- function(x){
as.integer(x > 2*sd(x))
}
x > 2*sd(x)
返回一个逻辑值(TRUE
/FALSE
(,如果我们将其转换为整数,则会将TRUE
更改为1,将FALSE
更改为0。
这会起作用吗:
t(apply(m, 1, function(x) +(x > 2*sd(x))))
我们可以在没有t
转运的情况下使用collapse
中的dapply
,并且是非常有效的
library(collapse)
dapply(m, cutoff, MARGIN = 1)