我有索引的向量,我想用它来过滤.在每一列中将 Select 不同的行.输出将是带有列数长度的筛选值的一个向量.不用慢循环就能萌芽.例如

set.seed(123)
(M <- matrix(rnorm(25), 5))

            [,1]       [,2]       [,3]       [,4]       [,5]
[1,] -0.56047565  1.7150650  1.2240818  1.7869131 -1.0678237
[2,] -0.23017749  0.4609162  0.3598138  0.4978505 -0.2179749
[3,]  1.55870831 -1.2650612  0.4007715 -1.9666172 -1.0260044
[4,]  0.07050839 -0.6868529  0.1106827  0.7013559 -0.7288912
[5,]  0.12928774 -0.4456620 -0.5558411 -0.4727914 -0.6250393

indíces <- c(2, 3, 1, 4, 4)
vect <- c()

for(i in 1:5) {
  vect <- c(vect, M[indíces[i], i])
}
vect
[1] -0.2301775 -1.2650612  1.2240818  0.7013559 -0.7288912

我有更大的数据集,因此for Cycle并不理想.但我想不出比这更好的了,也找不到更好的了.

推荐答案

我们可以使用cbind: M[cbind(indices, 1:ncol(M))]的矢量化运算

set.seed(123)
(M <- matrix(rnorm(25), 5))
indices <- c(2, 3, 1, 4, 4)

# vectorized
vect1 <- M[cbind(indices, 1:ncol(M))]

# loop
vect <- c()

for(i in 1:5) {
  vect <- c(vect, M[indíces[i], i])
}

# benchmark
library(microbenchmark)
mbm = microbenchmark(
vectorized =  M[cbind(indices, 1:ncol(M))],
loop = for(i in 1:5) {
  vect <- c(vect, M[indíces[i], i])
},
times=50
)
mbm

Unit: microseconds
       expr    min     lq     mean  median     uq    max neval cld
 vectorized    2.1    2.8    5.158    6.30    6.5   15.6    50  a 
       loop 2062.8 2089.2 2143.418 2114.55 2183.8 2391.0    50   b
autoplot(mbm)

enter image description here

R相关问答推荐

删除facet_wrap标签之间的水平线

r中的stat_difference函数不起作用

行式dppr中的变量列名

如何根据R中其他列的值有条件地从列中提取数据?

即使硬币没有被抛出,也要保持对其的跟踪

根据类别合并(汇总)某些行

R Select()可以测试不存在的子集列

使用for循环和粘贴创建多个变量

在不丢失空值的情况下取消列出嵌套列表

哪一行和行和 Select 特定行,但是考虑到Nas

如何指定我的函数应该查找哪个引用表?

合并后返回列表的数据帧列表

展开对数比例绘图的轴(添加填充)

过滤名称以特定字符串开头的文件

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

使用geom_iles在一个切片中包含多个值

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

如何在shiny 的应用程序 map 视图宣传单中可视化单点

网络抓取NBA.com

Data.table条件合并