以行方式应用阈值,其中截止值是相对于行的 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
而无需 t
ransposing 并且非常有效
library(collapse)
dapply(m, cutoff, MARGIN = 1)
我有一个类似这样的矩阵:
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
而无需 t
ransposing 并且非常有效
library(collapse)
dapply(m, cutoff, MARGIN = 1)