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

use*_*432 14 r isnullorempty is-empty

我有一个数据框,其中所有变量都是字符类型.许多列都是空的,即只有变量头,但没有值.有没有办法对空列进行子集化?

A5C*_*2T1 21

如果您的空列实际上是空字符列,则类似下面的内容应该有效.如果您的"空"字符列包含空格,则需要修改它.

样本数据:

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
Run Code Online (Sandbox Code Playgroud)

识别并删除"空"列.

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

或者,根据@Roland的建议:

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

  • 我建议扩展条件,以防有NA值而不是"":`all(x ==""|| is.na(x))`.但它会失去一点优雅虽然:) (4认同)
  • `mydf [,colSums(mydf!="")!= 0]`可能会更快. (2认同)

asb*_*asb 8

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

emptycols <- sapply(df, function (k) all(is.na(k)))
df <- df[!emptycols]
Run Code Online (Sandbox Code Playgroud)

要么:

emptycols <- colSums(is.na(df)) == nrow(df)
df <- df[!emptycols]
Run Code Online (Sandbox Code Playgroud)

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

emptycols <- colSums(df == "") == nrow(df)
Run Code Online (Sandbox Code Playgroud)


Ama*_*nda 5

我有类似的情况 - 我正在使用大型公共记录数据库,但当我将其缩小到我需要的日期范围和类别时,有大量的列未使用.有些是空白的,有些是NA.

选定的答案:https://stackoverflow.com/a/17672737/233467对我不起作用,但这样做:

df[!sapply(df, function (x) all(is.na(x) | x == ""))]
Run Code Online (Sandbox Code Playgroud)


Sam*_*rke 5

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

如果您有字符向量,其中每个值都是空字符串"",则可以首先NA使用na_ifdplyr包将这些值转换为整个data.frame:

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
Run Code Online (Sandbox Code Playgroud)