gpt4 book ai didi

r - 使用 dplyr 管道移除空列

转载 作者:行者123 更新时间:2023-12-04 11:19:22 24 4
gpt4 key购买 nike

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

数据框看起来像这样:

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 列进行子集化。

谢谢!非常感激。

最佳答案

我们可以使用 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]

关于r - 使用 dplyr 管道移除空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com