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)])