R矢量化:如何return满足条件的矩阵中每一行的第一个元素的索引并对所有元素求和直到该索引?
R Vectorization: How to return the index of the first element of each row in a matrix that meets a condition and sum all elements until that index?
我正在寻找矢量化解决方案。假设我通过替换生成了 10 个抽取的 100 个样本。接下来,我想找到累积和矩阵第一个元素的第一个索引,这意味着某种条件,比如 >=10。然后,我想对每一行的所有元素求和,直到满足该条件的第一个元素的索引为止。 MWE:
set <- c(1, 5, 7, 13, 15, 17)
samp <- samp <- matrix(sample(set, size = 100*10, replace = TRUE), nrow=simCount) # generate 100 samples of 10 draws
b <- matrix(apply(samp, 1, cumsum),
nrow = 100, byrow=TRUE) >= 10 # compare each element with 10, return boolean
我不确定如何将 apply
与 which(x)=="TRUE"
一起使用。我尝试了一些变体,但不确定如何正确编码。
在我得到它之后,我将能够使用 apply(b, 1, min)
到 return 为 >=10 的每一行的第一个元素(最小索引)。
请为 "random" 个示例设置种子:
set.seed(111)
samp <- matrix(sample(1:5, s=1000, r=T), nrow=100)
(answer1 <- samp[which(apply(samp,1,function(x)sum(x)>30)),1])
# [1] 4 3 3 3 1 1 3 5 2 4 2 5 4 2 4 1 3 2 4 4 5 4 2 4 5 5 4 5 3 3 1 1 2 1 4 3 4 5
#[39] 1 5 1 4 4 3 3 2 5 5
解释:
apply(samp,1, function(x) sum(x) > 30)
好吧,如果您添加 10 个正整数,>=10
将始终为真。
此函数的每一行应用于 "samp"。
which(x)
returns x 的所有 TRUE 值的索引。 (感兴趣的行)
samp[
(which 返回的行),
(1
)st column]
... 基本索引
从外到内逐步解开,以便更好地理解。
b <- matrix(apply(samp, 1, cumsum), nrow=100, byrow=T)>=10
apply(b,1,function(x)which(x)[1])
# [1] 4 5 4 3 3 5 3 4 3 4 3 3 5 4 5 4 2 4 3 6 3 3 5 4 3 3 2 4 4 6 3 4 3 4 5 4 4
# [38] 4 3 5 3 6 3 3 5 5 3 3 4 6 4 5 4 4 3 4 4 4 2 5 3 4 3 4 4 3 4 6 3 5 4 4 4 4
# [75] 3 3 5 4 4 3 3 4 4 5 4 4 4 3 4 3 5 4 3 5 3 6 4 5 5 3
我们可以使用 library(matrixStats)
中的 rowCumsums
library(matrixStats)
apply(rowCumsums(samp)>=10, 1, which.max)
我正在寻找矢量化解决方案。假设我通过替换生成了 10 个抽取的 100 个样本。接下来,我想找到累积和矩阵第一个元素的第一个索引,这意味着某种条件,比如 >=10。然后,我想对每一行的所有元素求和,直到满足该条件的第一个元素的索引为止。 MWE:
set <- c(1, 5, 7, 13, 15, 17)
samp <- samp <- matrix(sample(set, size = 100*10, replace = TRUE), nrow=simCount) # generate 100 samples of 10 draws
b <- matrix(apply(samp, 1, cumsum),
nrow = 100, byrow=TRUE) >= 10 # compare each element with 10, return boolean
我不确定如何将 apply
与 which(x)=="TRUE"
一起使用。我尝试了一些变体,但不确定如何正确编码。
在我得到它之后,我将能够使用 apply(b, 1, min)
到 return 为 >=10 的每一行的第一个元素(最小索引)。
请为 "random" 个示例设置种子:
set.seed(111)
samp <- matrix(sample(1:5, s=1000, r=T), nrow=100)
(answer1 <- samp[which(apply(samp,1,function(x)sum(x)>30)),1])
# [1] 4 3 3 3 1 1 3 5 2 4 2 5 4 2 4 1 3 2 4 4 5 4 2 4 5 5 4 5 3 3 1 1 2 1 4 3 4 5
#[39] 1 5 1 4 4 3 3 2 5 5
解释:
apply(samp,1, function(x) sum(x) > 30)
好吧,如果您添加 10 个正整数,>=10
将始终为真。
此函数的每一行应用于 "samp"。
which(x)
returns x 的所有 TRUE 值的索引。 (感兴趣的行)
samp[
(which 返回的行),
(1
)st column]
... 基本索引
从外到内逐步解开,以便更好地理解。
b <- matrix(apply(samp, 1, cumsum), nrow=100, byrow=T)>=10
apply(b,1,function(x)which(x)[1])
# [1] 4 5 4 3 3 5 3 4 3 4 3 3 5 4 5 4 2 4 3 6 3 3 5 4 3 3 2 4 4 6 3 4 3 4 5 4 4
# [38] 4 3 5 3 6 3 3 5 5 3 3 4 6 4 5 4 4 3 4 4 4 2 5 3 4 3 4 4 3 4 6 3 5 4 4 4 4
# [75] 3 3 5 4 4 3 3 4 4 5 4 4 4 3 4 3 5 4 3 5 3 6 4 5 5 3
我们可以使用 library(matrixStats)
rowCumsums
library(matrixStats)
apply(rowCumsums(samp)>=10, 1, which.max)