R:删除多个空字符变量列

时间:2013-07-16 09:21:26

标签: r is-empty isnullorempty

我有一个数据框,其中所有变量都是字符类型。许多列都是完全空的,即只有变量头,但没有值。有没有办法将空列分组出来?

9 个答案:

答案 0 :(得分:19)

如果您的空列真的空字符列,则以下内容应该有效。如果您的“空”字符列包含空格,则需要进行修改。

示例数据:

mydf <- data.frame(
  A = c("a", "b"),
  B = c("y", ""),
  C = c("", ""),
  D = c("", ""),
  E = c("", "z")
)
mydf
#   A B C D E
# 1 a y      
# 2 b       z

识别并删除“空”列。

mydf[!sapply(mydf, function(x) all(x == ""))]
#   A B E
# 1 a y  
# 2 b   z

或者,按照@Roland的建议:

> mydf[, colSums(mydf != "") != 0]
  A B E
1 a y  
2 b   z

答案 1 :(得分:6)

您可以执行以下任一操作:

emptycols <- sapply(df, function (k) all(is.na(k)))
df <- df[!emptycols]

或:

emptycols <- colSums(is.na(df)) == nrow(df)
df <- df[!emptycols]

如果为空,则表示它们是"",第二种方法可以这样调整:

emptycols <- colSums(df == "") == nrow(df)

答案 2 :(得分:5)

我有类似的情况 - 我正在使用大型公共记录数据库,但是当我将其缩小到我需要的日期范围和类别时,有很多列不是&#39;在使用中。有些是空白的,有些是NA。

所选答案:https://stackoverflow.com/a/17672737/233467对我不起作用,但确实如此:

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

答案 3 :(得分:5)

如果您正在讨论所有值均为NA的列,请使用janitor包中的remove_empty("cols")

如果您有字符向量,其中每个值都是空字符串"",您可以先在dplyr包中使用NA将整个数据框中的值转换为na_if:< / p>

dat <- data.frame(
  x = c("a", "b", "c"),
  y = c("", "", ""),
  z = c(NA, NA, NA),
  stringsAsFactors = FALSE
)

dat
#>   x y  z
#> 1 a   NA
#> 2 b   NA
#> 3 c   NA

library(dplyr)
library(janitor)

dat %>%
  mutate_all(funs(na_if(., ""))) %>%
  remove_empty("cols")
#>   x
#> 1 a
#> 2 b
#> 3 c

答案 4 :(得分:4)

这取决于你的意思是空:是NA还是"",还是" "?这样的事情可能有用:

df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]

答案 5 :(得分:2)

这里是可以修改的东西,以排除包含任何指定变量的列。

newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" | 
x== "-4"} ) )] 

答案 6 :(得分:0)

如果您知道列索引,则可以使用

df[,-c(3, 5, 7)]

这将省略第3,5,7列。

答案 7 :(得分:0)

这也可以通过dplyrselect_if

完成
`select_if(df,function(x){any(!is.na(x))})`

或使用is.null()x=="",具体取决于数据中空值的定义方式。

答案 8 :(得分:0)

使用purrr软件包的简单解决方案:

purrr::discard(my_data_frame, ~all(is.na(.)))