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

问题描述 投票:12回答:7

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

r is-empty isnullorempty
7个回答
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

识别并删除“空”列。

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

7
投票

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

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)

5
投票

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

选定的答案:https://stackoverflow.com/a/17672737/233467不适合我,但这样做:

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

5
投票

如果你在谈论所有值都是NA的列,请使用janitor包中的remove_empty("cols")

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

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
投票

这取决于你的意思是空的:是NA还是"",还是甚至可以是" "?像这样的东西可能会起作用:

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

2
投票

以下是可以修改的内容,以排除不包含指定变量的列。

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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.