Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中传递空索引_R_Subset - Fatal编程技术网

在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