我有以下数据框:
a <- c(3, 2, 1)
a_1 <- c(NA, "", NA)
b <- c(3, 4, 1)
b_1 <- c(3, NA, 4)
c <- c("", "", "")
c_1 <- c(5, 8, 9)
d <- c(6, 9, 10)
d_1 <- c("", "", "")
e <- c(NA, NA, NA)
e_1 <- c(NA, NA, NA)
df <- data.frame(a, a_1, b, b_1, c, c_1,
d, d_1, e, e_1)
我想删除包含"_1"且只有空单元格和NA的列。但是,我只能找到删除数据框中包含空单元格和NA的所有列的代码。
empty_columns <- colSums(is.na(df) |
df == "") == nrow(df)
df[, !empty_columns]
df <- df[, colSums(is.na(df)) < nrow(df)]
a b b_1 c_1 d
1 3 3 3 5 6
2 2 4 NA 8 9
3 1 1 4 9 10
但我希望生成的数据框如下所示:
df2 <- data.frame(a, b, b_1, c, c_1, d, e)
a b b_1 c c_1 d e
1 3 3 3 5 6 NA
2 2 4 NA 8 9 NA
3 1 1 4 9 10 NA
5条答案
按热度按时间gzszwxb41#
您可以重新定义
empty_columns
以检查列名是否包含"_1"
...2cmtqfgy2#
这里有一个
tidyverse
,select
选项,ends_with
("_1")和(&
)列具有所有的NA
值(在将空白(""
)转换为NA
后,使用na_if
,然后删除那些使用-
的列bis0qfac3#
首先进行一些清洁和
type.convert
列。那就是
oewdyzsn4#
除了对
""
和NA
进行条件测试外,还使用grepl
过滤colnames
。如果有一列包含空单元格和字母数字值,则此操作也有效。
0x6upsns5#
如果你像我一样喜欢在列上迭代,那么在
empty_columns
向量上还有几个即兴重复。OP中棘手的事情是访问每列的名称和值;你可以通过处理名字并检索它们的列来实现,或者使用purrr::imap_lgl
,这是一个快捷方式。您也可以使用regex来代替组合
is.na
和== ""
。所有3个都得到相同的要删除的列集。