R 我应该在什么时候使用;其中";用于子集?

R 我应该在什么时候使用;其中";用于子集?,r,R,这是一个玩具的例子 iris %>% group_by(Species) %>% summarise(max = Sepal.Width[Sepal.Length == max(Sepal.Length)]) # A tibble: 3 x 2 Species max <fct> <dbl> 1 setosa 4 2 versicolor 3.2 3 virginica 3.8 帮助(其

这是一个玩具的例子

 iris %>% 
  group_by(Species) %>% 
  summarise(max = Sepal.Width[Sepal.Length == max(Sepal.Length)])

 # A tibble: 3 x 2
  Species      max
  <fct>      <dbl>
1 setosa       4  
2 versicolor   3.2
3 virginica    3.8
帮助(其中)
说明:

给出逻辑对象的真实索引,并考虑数组索引

==
执行相同的操作:显示TRUE和FALSE

那么什么时候
which()。试一试
(1:2)[which(c(TRUE,NA))]
v.s.
(1:2)[c(TRUE,NA)]

如果未删除
NA
,则通过
NA
索引将给出
NA
(请参见
?提取
)。但是,
na.不能删除此项,否则您可能会得到
TRUE
的位置,这可能是错误的。一种安全的方法是用
FALSE
替换
NA
,然后进行索引。但是为什么不直接使用
哪个

因为这个问题是专门关于子集的,我想我会的 说明在一段时间内使用
which()
的一些性能优势 链接问题中提出的逻辑子集

当您想要提取整个子集时,在 处理速度,但使用
which()
需要。然而,(例如,展示一些奇怪的 调查结果),
which()
具有显著的速度和内存优势,因为 通过对数据帧的结果进行子集设置,可以避免对数据帧进行两次子集设置
which()

以下是基准:

df[1]53940 10
(亩),10,,
{
i mu,][i,],,
其中1=df[which(df$price>mu),][i,],,
which_2=df[which(df$price>mu)[i],]
)
}
)
#>运行时使用:
#>n
#> 1 19657
#> 2    10
#>#tibble:6 x 11
#>表达式n最小平均最大中位数'itr/sec'mem_alloc
#>                   
#>1逻辑19657 1.5ms 1.81ms 1.71ms 3.39ms 553。5.5MB
#>2其中_119657 1.41ms 1.61ms 1.56ms 2.41ms 620。2.89MB
#>3其中_219657 826.56us 934.72us 910.88us 1.41ms 1070。1.76MB
#>4逻辑10 893.12us 1.06ms 1.02ms 1.93ms 941。4.21MB
#>5其中_110 814.4us 944.81us 908.16us 1.78ms 1058。1.69MB
#>6其中_210 230.72us 264.45us 249.28us 1.08ms 3781。498.34KB
#> # ... 还有3个变量:n_gc、n_itr、total_time

由(v0.2.0)于2018-08-19创建。

删除
NA
元素的
。如果我们需要获得与
相同的行为,而
中存在
NA
s
时,请使用另一个条件以及
==`

iris %>% 
  group_by(Species) %>% 
  summarise(max = Sepal.Width[Sepal.Length == max(Sepal.Length, na.rm = TRUE) & 
                                   !is.na(Sepal.Length)])

的其他用法相关的问题/答案:
=
返回一个逻辑,
返回一个整数,一些函数接受两个输入,在这种情况下它们通常是等价的(答案解释异常),但你不应该期望总是这样。哇,这是一个有用的例子!,为什么
which_1=df[which(df$price>mu),][i,],which_2=df[which(df$price>mu)[i],]
有区别?@0Hong这是因为获取数据帧子集要比获取向量子集慢得多。在
which_1
中可以得到2个数据帧子集,而在
which_2
中可以得到1个向量子集和1个数据帧子集。如果是这样,列表子集的速度比数据快。帧?@0Hong数据帧子集的速度慢,因为您必须为数据帧的每一列都做一个向量子集(这也是为什么将一个数据帧的多列子集比列数较少的数据帧子集要慢的原因)。如果在列表子集中,您希望为列表中的每个元素获取子集,那么速度也会很慢。但是,如果您只获取列表元素的子集,那么速度会更快。
iris %>% 
  group_by(Species) %>% 
  summarise(max = Sepal.Width[Sepal.Length == max(Sepal.Length, na.rm = TRUE) & 
                                   !is.na(Sepal.Length)])