23

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

4

9 回答 9

28

如果您的空列确实是空字符列,则应该使用以下内容。如果您的“空”字符列包括空格,则需要对其进行修改。

样本数据:

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
于 2013-07-16T09:25:54.460 回答
12

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

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)
于 2013-07-16T09:26:53.320 回答
12

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

如果您有每个值都是空字符串的字符向量,则""可以首先使用 dplyr 包将这些值转换为NA整个na_ifdata.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
于 2017-01-27T13:23:42.713 回答
6

我有类似的情况——我正在使用一个大型公共记录数据库,但是当我将它缩减到我需要的日期范围和类别时,有很多列没有使用。有些是空白的,有些是 NA。

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

df[!sapply(df, function (x) all(is.na(x) | x == ""))]
于 2016-05-12T05:19:44.710 回答
4

这取决于您所说的空是什么意思:是 NA 还是"",或者甚至可以是" "?像这样的东西可能会起作用:

df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]
于 2013-07-16T09:35:39.973 回答
3

这也可以通过dplyrandselect_if

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

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

于 2019-10-11T16:49:24.163 回答
2

这是可以修改以排除包含任何指定变量的列的内容。

newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" | 
x== "-4"} ) )] 
于 2018-07-28T05:44:59.427 回答
2

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

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

于 2019-12-30T10:51:19.763 回答
0

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

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

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

于 2013-07-16T09:23:16.573 回答