`select_if`与非规范列名

时间:2017-01-26 21:56:37

标签: r dplyr

我使用的是dplyr 0.5.0。

考虑以下两个tibble

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))

在第一种情况下:

> select_if(nice, function(col) !any(is.na(col)))
# A tibble: 2 x 2
    num     a
  <dbl> <dbl>
1     1     1
2     2     2

在第二部分,我没有得到好的&#34;带有数字colname的完整列:

> select_if(numeric_cols, function(col) !any(is.na(col)))
# A tibble: 2 x 1
    num
* <dbl>
1     1
2     2

我在实际分析代码中遇到了一个更大,结构非常相似的tibble的问题,但是我收到了这个错误:

    Error: Position must be between 0 and n

我未能制作一个产生此错误的小型可共享示例,我忘记了如何使用R调试器。让我知道是否值得我学习如何再次使用它。

我错过了什么吗?这是一个错误吗?

我通过简单地使用更多&#34; classic&#34;来解决这个问题。 R,但这肯定是一个减速带,而不是可读:

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

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

1 个答案:

答案 0 :(得分:0)

select_if只是select_的一个简单包装器。问题是如果你运行select_(numeric_cols, .dots = "1")它会将"1"解释为列位置,而不是列名称,因此select_(numeric_cols, .dots = c("session", "1"))(这是你的谓词函数将过滤的内容)与select_(numeric_cols, .dots = c("session", "session")),因此你只能回到&#34;会话&#34; numeric_cols中的列。

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

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