以行方式应用阈值,其中截止值是相对于行的 sd

Applying a threshold in a row-wise fashion, where cutoff value is relative to sd of row

我有一个类似这样的矩阵:

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 始终 returns 转置结果(参见 Why apply() returns a transposed xts matrix?)。

mT <- t(apply(m, 1, cutoff))

您还可以将 cutoff 函数简化为 -

cutoff <- function(x){
  as.integer(x > 2*sd(x))
} 

x > 2*sd(x) returns 逻辑值 (TRUE/FALSE),如果我们将其转换为整数,它会将 TRUE 更改为 1 并且 FALSE 到 0.

这行得通吗:

t(apply(m, 1, function(x) +(x > 2*sd(x))))

我们可以使用 collapse 中的 dapply 而无需 transposing 并且非常有效

library(collapse)
dapply(m, cutoff, MARGIN = 1)