如何解决筛选出多个条件的data.frame而不将其写出
如何在没有实际写出的情况下通过多个条件有效地过滤data.frame
。
为更清楚起见,让我们看下面一个小的简化示例,其中我们希望提取1到100之间介于1和2或4和6或60和65之间的所有整数:>
df <- data.frame(number = 1:100,someothermeasure = rnorm(100))
filters <- matrix(c(1,2,4,6,60,65),ncol = 2,byrow = T)
我希望获得与以下相同的结果,但不手工列出各个条件:
dplyr::filter(df,(number >= filters[1,1] & number <= filters[1,2])|(number >= filters[2,1] & number <= filters[2,2])|(number >= filters[3,1] & number <= filters[3,2]))
只有当一个人需要过滤的条件很少时,才可以写出来。但是,当过滤条件dim(filters)[1]
例如等于10000
时该怎么办?如何处理这种情况?
解决方法
apply
是多次应用功能的不错的工具:
apply(X = filters,MARGIN = 1,FUN = function(x,y){
y %>%
dplyr::filter(number >= x[1] & number <= x[2])
},y = df)
,
具有dplyr
和rowwise()
的{{1}}解决方案。
filter()
或者您可以在library(dplyr)
df %>%
rowwise() %>%
filter(any(number >= filters[,1] & number <= filters[,2])) %>%
ungroup()
中使用pmap_dfr()
,它会自动按行合并所有过滤的数据。
purrr
两种方法都给出
library(purrr)
pmap_dfr(as.data.frame(filters),~ filter(df,number >= .x & number <= .y))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。