使用dplyr的select if函数根据范围条件选择列

3

我有一个数据集:

 var1 <- c(333, 213, 456)
 var2 <- c(3, 10, 500)
 var3 <- c(356, 813, 856)
 var4 <- c("aaa", "bbb", "ccc")
 var5 <- c(589, 111, 989)

dataset <- data.frame(var1, var2, var3, var4, var5)

我希望基于数值范围保留列:所有子集列的数值必须在99和1000之间。

我尝试过:

library (dplyr)
dataset2 <- dataset %>%
select_if(~.>99 & . <1000)

我想要的是:

数据集2:变量1,变量3,变量4


非数字呢? - NelsonGon
@NelsonGon 我有混合数据。我只想根据条件范围选择列。 我想删除所有其他列。 - Wilcar
你的例子保留了var4,但出于某种原因删除了var5。var4具有因子/字符。 - NelsonGon
4个回答

6
您还可以这样做:
dataset %>%
 select_if(~ is.numeric(.) && all(between(., 99, 1000)))

  var1 var3 var5
1  333  356  589
2  213  813  111
3  456  856  989

4
一个 dplyr-purrr 的方案可能是:
dataset %>%
  select_if(is.numeric) %>% 
   purrr::keep(~all(.x <=1000))
  var1 var2 var3 var5
1  333    3  356  589
2  213   10  813  111
3  456  500  856  989

4

使用基本的R语言Filter:

Filter(function(x) is.numeric(x) && min(x) > 99 && max(x) < 1000, dataset)
#>   var1 var3 var5
#> 1  333  356  589
#> 2  213  813  111
#> 3  456  856  989

4
这是将到目前为止给出的所有答案结合起来使用 purrrkeepdiscard 的一种方式。
purrr::keep(dataset, ~is.numeric(.) && min(.) >= 99 && max(.) <= 1000)

#  var1 var3 var5
#1  333  356  589
#2  213  813  111
#3  456  856  989

使用discard关键字

purrr::discard(dataset, ~!is.numeric(.) || min(.) < 99 || max(.) > 1000)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接