【问题标题】:dplyr select using logicaldplyr 使用逻辑选择
【发布时间】:2015-01-08 14:38:43
【问题描述】:

dplyr 中的select 可以与逻辑向量一起使用吗?

dat <- tbl_df(mtcars)
isNum <- sapply(dat, is.numeric)
select(dat, isNum)
select(dat, isNum)

名称错误(sel)[未命名]

索引有效:select(dat,(1:ncol(dat))[isNum]) 那么为什么不合乎逻辑呢?

当我看到像 starts_with select(dat,starts_with("m")) 这样的 select 辅助函数时,我认为它们可以使用逻辑...

【问题讨论】:

  • 可能是topic for dplyr 0.3.1:“一般来说,在dplyr 中按布尔条件过滤列的最佳方法是什么?”
  • 我认为你应该发布select(dat,which(isNum)) 作为答案(如果它看起来是最好的解决方案,甚至接受它)

标签: r dplyr


【解决方案1】:

正如其他答案中非常清楚地说明的那样,对您的具体问题的回答是。您不能在dplyr::select() 中使用逻辑向量。

但是,在 dplyr (v>=0.5.0) 的较新版本中,有一个新函数支持使用要应用于列或逻辑向量的谓词函数select_if().

select_if 与谓词函数一起使用,您的示例可以简化如下:

tbl_df(mtcars) %>% dplyr::select_if(is.numeric)

但是,您也可以将select_if 与逻辑向量一起使用。这更直接地解决了您上面的用例,如下所示:

dat <- tbl_df(mtcars)
isNum <- sapply(dat, is.numeric)
select_if(dat, isNum)

【讨论】:

    【解决方案2】:

    按照本的建议:

    select(dat, which(isNum))

    【讨论】:

    • 这非常有用,因为我们可以将“which”放在任何适当的逻辑结构前面以返回列号。
    【解决方案3】:

    我的答案是:

    • 否(“dplyr 中的选择可以与逻辑向量一起使用吗?”)

    证据:(1) 您的示例,(2) 帮助页面:

    ...:逗号分隔的未引用表达式列表。你可以治疗 变量名称就像它们是位置一样。使用正值 选择变量;使用负值删除变量。

    没有说任何关于逻辑向量的事情。对不起。

    • 我不知道(“为什么不合乎逻辑?”)——“只是因为”(我认为除了开发人员之外没有人能真正回答这个问题)。您可以提出功能请求...

    有点笨拙,但是

    select_(dat,.dots=names(isNum)[isNum])
    

    有效(请注意,您需要 select_ 变体以允许使用字符向量)。不过好老派

    subset(dat,select=isNum)
    

    似乎也可以正常工作(除非它无法以我没有想到的其他方式与 dplyr 很好地配合使用)。

    如果你看dplyr:::starts_with的代码,你可以看到它返回的是一个位置向量,而不是一个逻辑向量

    function (vars, match, ignore.case = TRUE) 
    {
        stopifnot(is.string(match), !is.na(match), nchar(match) > 
            0)
        if (ignore.case) 
            match <- tolower(match)
        n <- nchar(match)
        if (ignore.case) 
            vars <- tolower(vars)
        which(substr(vars, 1, n) == match)
    }
    

    我打算建议您尝试修改此函数以创建 is_numeric 等效项,但我不太了解底层的魔法......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2018-12-23
      • 2015-05-05
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多