R `如果`使用非规范列名时行为不稳定,请选择_

R `如果`使用非规范列名时行为不稳定,请选择_,r,dplyr,R,Dplyr,我使用的是DPLYR0.5.0 考虑以下两个tibbles: nice <- tibble(session=c(1,2), a=c(1,2), b=c(3,NA)) numeric_cols <- tibble(session=c(1,2), `1`=c(1,2), `2`=c(3,NA)) 我未能制作一个产生此错误的小型可共享示例,并且我忘记了如何使用R调试器。让我知道是否值得我再次学习如何使用它 我错过什么了吗?这是虫子吗 我只是简单地使用了更多的“经典”R来解决这个问题,但这

我使用的是DPLYR0.5.0

考虑以下两个
tibble
s:

nice <- tibble(session=c(1,2), a=c(1,2), b=c(3,NA))
numeric_cols <- tibble(session=c(1,2), `1`=c(1,2), `2`=c(3,NA))
我未能制作一个产生此错误的小型可共享示例,并且我忘记了如何使用R调试器。让我知道是否值得我再次学习如何使用它

我错过什么了吗?这是虫子吗

我只是简单地使用了更多的“经典”R来解决这个问题,但这绝对是一个减速带,没有那么可读:

numeric_cols[
    summarize_all(numeric_cols, function(col) !any(is.na(col))) %>%
    unlist() ]

(如果你想知道,我最终使用数字列的原因是因为我在标识符列上展开,以便在矩阵表示上使用PCA。我不想更改我的标识符。)

select\u如果
只是
select\u的简单包装。问题是如果运行
select(numeric\u cols,.dots=“1”)
它将
“1”
解释为列位置,而不是列名,因此
select(numeric\u cols,.dots=c(“session”,“1”)
(这是谓词函数将过滤到的内容)与
select(numeric\u cols,.dots=c(“session”)是一样的,“session”)
,因此您只能从numeric\u cols返回“session”列

我真的建议您将列重命名为更合适的名称,但如果必须这样做,这应该可以:

body(select_if)[[5]] <- quote(select(.data, one_of(vars)))
select_if(numeric_cols, function(col) !any(is.na(col)))
body(如果选择)[5]]
    Error: Position must be between 0 and n
numeric_cols[
    summarize_all(numeric_cols, function(col) !any(is.na(col))) %>%
    unlist() ]
body(select_if)[[5]] <- quote(select(.data, one_of(vars)))
select_if(numeric_cols, function(col) !any(is.na(col)))
# A tibble: 2 × 2
  session   `1`
    <dbl> <dbl>
1       1     1
2       2     2