【问题标题】:Piping the removal of empty columns using dplyr使用 dplyr 管道删除空列
【发布时间】:2018-08-28 17:12:12
【问题描述】:

我有一个宽格式的参与者问卷回复数据框,每一列代表一个特定的问题/项目。

数据框看起来像这样:

id <- c(1, 2, 3, 4)
Q1 <- c(NA, NA, NA, NA)
Q2 <- c(1, "", 4, 5)
Q3 <- c(NA, 2, 3, 4)
Q4 <- c("", "", 2, 2)
Q5 <- c("", "", "", "")
df <- data.frame(id, Q1, Q2, Q3, Q4, Q5)

我希望 R 删除每行中包含 (1) NA 或 (2) 空白的所有值的列。因此,我不想要 Q1 列(完全由 NA 组成)和 Q5 列(完全由“”形式的空白组成)。

根据thread,我可以使用以下内容删除完全由 NA 组成的列:

df[, !apply(is.na(df), 2, all]

但是,该解决方案无法处理空格 ("")。当我在 dplyr 管道中执行所有这些操作时,有人还可以解释我如何将上述代码合并到 dplyr 管道中吗?

此时,我的 dplyr 管道如下所示:

df <- df %>%
    select(relevant columns that I need)

之后,我被困在这里并使用方括号 [] 对非 NA 列进行子集化。

谢谢!非常感谢。

【问题讨论】:

  • 你的 dplyr 管道现在是什么样子的?
  • 我已经更新了我的帖子,以反映我的 dplyr 管道现在的样子。

标签: r dplyr


【解决方案1】:

使用dplyr 1.0 版,您可以在select 中使用辅助函数where(),而无需使用select_if

library(tidyverse)
df <- data.frame(id = c(1, 2, 3, 4),
                 Q1 = c(1, "", 4, 5), 
                 Q2 = c(NA, NA, NA, NA),
                 Q3 = c(NA, 2, 3, 4), 
                 Q4 = c("", "", 2, 2), 
                 Q5 = c("", "", "", ""))

df %>% select(where(~ !(all(is.na(.)) | all(. == ""))))
#>   id Q1 Q3 Q4
#> 1  1  1 NA   
#> 2  2     2   
#> 3  3  4  3  2
#> 4  4  5  4  2

【讨论】:

    【解决方案2】:

    我们可以使用select_if的版本

    library(dplyr)
    df %>%
       select_if(function(x) !(all(is.na(x)) | all(x=="")))
    
    #  id Q2 Q3 Q4
    #1  1  1 NA   
    #2  2     2   
    #3  3  4  3  2
    #4  4  5  4  2
    

    或者不使用匿名函数调用

    df %>% select_if(~!(all(is.na(.)) | all(. == "")))
    

    您还可以将apply 语句修改为

    df[!apply(df, 2, function(x) all(is.na(x)) | all(x==""))]
    

    或使用colSums

    df[colSums(is.na(df) | df == "") != nrow(df)]
    

    逆向

    df[colSums(!(is.na(df) | df == "")) > 0]
    

    【讨论】:

    • 谢谢! select和select_if有什么区别
    • @DTYK select 期望选择列的名称,而 select_if 期望只有当值为 TRUE 时才会在其中选择列的逻辑向量。
    【解决方案3】:

    您可以使用select_if 来执行此操作。

    方法:

    col_selector <- function(x) {
      return(!(all(is.na(x)) | all(x == "")))
    }
    
    
    df %>% select_if(col_selector)
    

    输出:

      id Q2 Q3 Q4
    1  1  1 NA   
    2  2     2   
    3  3  4  3  2
    4  4  5  4  2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 2014-12-27
      • 2017-03-27
      • 2020-06-09
      • 1970-01-01
      • 2023-03-09
      • 2015-07-07
      • 1970-01-01
      相关资源
      最近更新 更多