我有一个数据框,其中所有变量都是字符类型。许多列都是完全空的,即只有变量头,但没有值。有没有办法将空列分组出来?
答案 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)
这也可以通过dplyr
和select_if
`select_if(df,function(x){any(!is.na(x))})`
或使用is.null()
或x==""
,具体取决于数据中空值的定义方式。
答案 8 :(得分:0)
使用purrr
软件包的简单解决方案:
purrr::discard(my_data_frame, ~all(is.na(.)))