在R中传递空索引
假设我想将向量在R中传递空索引,r,subset,R,Subset,假设我想将向量a子集,我可以将索引值传递给变量中的子集,例如a[idx] 我应该设置什么值来获得整个a(即a[])的等价值 基本上,我有一个以idx为参数的函数,希望传递一个值来处理整个数据集。我假设应该有比1:length(a)更好的方法。你可以使用一个小技巧:将idx设置为TRUE a[TRUE]由@ahmohamed给出的答案是正确的,并且是解决这个问题的一种非常简洁的方法。如果您使用的是大型数据集,那么让我来说明循环使用逻辑向量和使用数字索引的性能差异: a <- sample(1
a
子集,我可以将索引值传递给变量中的子集,例如a[idx]
我应该设置什么值来获得整个a
(即a[]
)的等价值
基本上,我有一个以
idx
为参数的函数,希望传递一个值来处理整个数据集。我假设应该有比1:length(a)
更好的方法。你可以使用一个小技巧:将idx
设置为TRUE
a[TRUE]
由@ahmohamed给出的答案是正确的,并且是解决这个问题的一种非常简洁的方法。如果您使用的是大型数据集,那么让我来说明循环使用逻辑向量和使用数字索引的性能差异:
a <- sample(1e6, 1e7, TRUE)
library(microbenchmark)
microbenchmark(a[TRUE], a[seq_along(a)])
#Unit: milliseconds
# expr min lq median uq max neval
# a[TRUE] 238.10089 254.63311 261.03451 287.7352 1163.8499 100
# a[seq_along(a)] 64.49373 95.48278 98.00964 142.4811 709.2872 100
a允许子集中的索引参数“缺失”(请参见?“[”
):
是的,向量循环在这种情况下很方便。基本上,你最终得到的是相当于a[rep(TRUE,length(a))]
你不需要任何关于a
的信息,也就是它的长度。R会处理它!这太棒了!花了一个小时来搜索它。谢谢,我理解缺失部分。我不知道如何设置i
,当i
已经有一个先验值时,它会反映为缺失。我尝试将其设置为“NULL”或者“NA”或“integer(0)”,但它不起作用。另外,值得注意的是,你的微基准结果显示的TRUE
和seq\u之间的差异并没有@docendo discimus显示的那么大。我想知道区别是什么。@Ricky:请参阅更新的帖子,其中包含substitute()
假装丢失。至于TRUE
和seq_
,我仍然没有发现像@docendo一样的速度差异,尽管这次比较相似。这很有趣,谢谢!如果你没有发布这篇文章,我会使用TRUE
!
ff1 = function(x, i) x[i]
ff2 = function(x, i = TRUE) x[i]
ff3 = function(x, i = seq_along(x)) x[i]
ff4 = function(x, i = substitute()) x[i]
a = sample(10)
a
# [1] 3 8 2 6 9 7 5 1 4 10
ff1(a)
# [1] 3 8 2 6 9 7 5 1 4 10
ff2(a)
# [1] 3 8 2 6 9 7 5 1 4 10
ff3(a)
# [1] 3 8 2 6 9 7 5 1 4 10
ff4(a)
# [1] 3 8 2 6 9 7 5 1 4 10
a = runif(1e6)
identical(ff1(a), ff2(a))
#[1] TRUE
identical(ff1(a), ff3(a))
#[1] TRUE
identical(ff1(a), ff4(a))
#[1] TRUE
microbenchmark::microbenchmark(ff1(a), ff2(a), ff3(a), ff4(a), times = 25)
#Unit: milliseconds
# expr min lq median uq max neval
# ff1(a) 2.026772 2.131173 2.207037 2.930885 3.789409 25
# ff2(a) 12.091727 12.151931 12.318625 12.740057 16.829445 25
# ff3(a) 8.930464 9.104118 9.454557 9.643175 13.131213 25
# ff4(a) 2.024684 2.090108 2.156577 2.289166 3.496391 25