【问题标题】:select columns based on range condition and containing also NA values根据范围条件选择列并且还包含 NA 值
【发布时间】:2020-01-06 04:07:18
【问题描述】:

基于我的问题here

我有一个数据集: 我想根据值范围保留列:子集列的所有值必须在 99 到 1000 之间。

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

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

没有 NA 值也能正常工作

dataset %>%
select_if(~ is.numeric(.) && all(between(., 99, 1000)))

purrr::keep(dataset, ~is.numeric(.) && min(.) >= 99 && max(.) <= 1000)

但是当我在我的数据中引入 NA 时:

select_if 函数返回此错误:
"只有字符串可以转换为符号"

puur::keep 函数返回此错误: "谓词函数必须返回单个 TRUEFALSE,而不是缺失值"

如何管理 NA ?根据包含 alos NA 值的值范围选择列?

【问题讨论】:

  • 您需要NA 值还是可以删除它们?将NAs 与其他值进行比较有点困难,将返回NA。我能想到的一种解决方案是将NA 重新编码为0s,然后返回NA。这很糟糕,因为您可能还有其他 0s 。
  • @NelsonGon。我想保留NA。如果 A reconde NA to 0 他们将超出范围......

标签: r dplyr purrr


【解决方案1】:

我认为这应该解决它

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

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

purrr::keep(dataset, ~is.numeric(.) && min(.,na.rm = TRUE) >= 99 && max(.,na.rm = TRUE) <= 1000)
#>   var1 var3 var5
#> 1  333  356   NA
#> 2   NA  813  111
#> 3  456  856  989

reprex package (v0.3.0) 于 2020-01-05 创建

【讨论】:

    【解决方案2】:

    由于between没有na.rm参数,你可以修改select_if

    library(dplyr)
    dataset %>% select_if(~ is.numeric(.) && all(between(., 99, 1000) | is.na(.)))
    
    #  var1 var3 var5
    #1  333  356   NA
    #2   NA  813  111
    #3  456  856  989
    

    【讨论】:

    • select_if(~ is.numeric(.) &amp;&amp; all(between(., 10000, 80799), na.rm = TRUE))works 也可以,但在我的真实数据中,我有只有 NA 值的列,命令也保留这些列!
    • @Wilcar 是的,allna.rm 参数,但我认为它没有选择您想要的列?对于具有所有 NA 值的列,您可以执行 dataset %&gt;% select_if(~ is.numeric(.) &amp;&amp; all(between(., 99, 1000) | is.na(.)) &amp;&amp; !all(is.na(.)))
    • 伟大的更新!我正在使用%&gt;% select_if(function(x){!all(is.na(x))})
    【解决方案3】:

    你可以使用基地的findInterval()

    dataset[colMeans(sapply(dataset, findInterval, c(99, 1000)), na.rm=T) == 1]
    #   var1 var3 var5
    # 1  333  356   NA
    # 2   NA  813  111
    # 3  456  856  989
    

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多