【发布时间】:2013-07-16 09:21:26
【问题描述】:
我有一个数据框,其中所有变量都是字符类型。许多列是完全空的,即只有变量标题在那里,但没有值。有没有办法将空列子集化?
【问题讨论】:
-
顺便说一句,空,你是指
NA还是""?
标签: r is-empty isnullorempty
我有一个数据框,其中所有变量都是字符类型。许多列是完全空的,即只有变量标题在那里,但没有值。有没有办法将空列子集化?
【问题讨论】:
NA还是""?
标签: r is-empty isnullorempty
如果您的空列是 真的 空字符列,则类似以下内容应该可以工作。如果您的“空”字符列包含空格,则需要对其进行修改。
样本数据:
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
【讨论】:
all(x == "" || is.na(x))。但它会失去一点优雅:)
mydf[,colSums(mydf!="")!=0] 可能会更快。
NA 与读取错误不同,但这是个好建议无论如何。
mydf[,colSums(mydf!="")>0] 更合你的口味?
您可以执行以下任一操作:
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)
【讨论】:
is.na 在字符向量上也可以正常工作。这是因为他正在将一个匿名函数传递给另一个函数。 @asb,我认为您不能那样做。你必须这样做sapply(df, function(x) all(is.na(x)))。
如果您谈论的是所有值都是 NA 的列,请使用 janitor 包中的 remove_empty("cols")。
如果您有每个值都是空字符串 "" 的字符向量,您可以首先使用 dplyr 包中的 na_if 在整个 data.frame 中将这些值转换为 NA:
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
【讨论】:
remove_empty("cols")。
我也有类似的情况——我正在使用一个大型公共记录数据库,但是当我将它缩减到我需要的日期范围和类别时,有大量的列没有被使用。有些是空白的,有些是 NA。
选择的答案:https://stackoverflow.com/a/17672737/233467 对我不起作用,但这样做:
df[!sapply(df, function (x) all(is.na(x) | x == ""))]
【讨论】:
这取决于您所说的空是什么意思:是 NA 还是 "",或者甚至可以是 " "?这样的事情可能会起作用:
df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]
【讨论】:
这也可以由dplyr 和select_if 完成
`select_if(df,function(x){any(!is.na(x))})`
或使用is.null() 或x=="",具体取决于数据中空值的定义方式。
【讨论】:
可以修改以下内容以排除包含任何指定变量的列。
newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" |
x== "-4"} ) )]
【讨论】:
使用purrr 包的简单解决方案:
purrr::discard(my_data_frame, ~all(is.na(.)))
【讨论】:
如果你知道列索引,你可以使用
df[,-c(3, 5, 7)]
这将省略第 3、5、7 列。
【讨论】: