web-dev-qa-db-ja.com

R:文字変数の複数の空の列を削除する

すべての変数が文字タイプであるデータフレームがあります。列の多くは完全に空です。つまり、変数ヘッダーのみがあり、値はありません。空の列をサブセット化する方法はありますか?

14
user702432

空の列がreally空の文字列の場合、次のようなものが機能します。 「空」の文字列にスペースなどが含まれている場合は、変更する必要があります。

サンプルデータ:

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
21

次のいずれかを実行できます。

emptycols <- sapply(df, function (k) all(is.na(k)))
df <- df[!emptycols]

または:

emptycols <- colSums(is.na(df)) == nrow(df)
df <- df[!emptycols]

空の場合は""、2番目のアプローチは次のように適応できます。

emptycols <- colSums(df == "") == nrow(df)
7
asb

同様の状況があります-大規模な公開レコードデータベースで作業していますが、必要な日付範囲とカテゴリだけに絞ると、使用されていない列が大量にあります。一部は空白で、一部はNAです。

選択された答え: https://stackoverflow.com/a/17672737/233467 は私にとってはうまくいきませんでしたが、これはうまくいきました:

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

すべての値が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
5
Sam Firke

空の意味は次のとおりです。NAまたは""、または" "?このような何かがうまくいくかもしれません:

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

これは、指定された変数を含む列を除外するように変更できるものです。

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

列のインデックスがわかっている場合は、

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

これにより、列3、5、7が省略されます。

0
TMS