すべての変数が文字タイプであるデータフレームがあります。列の多くは完全に空です。つまり、変数ヘッダーのみがあり、値はありません。空の列をサブセット化する方法はありますか?
空の列が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
次のいずれかを実行できます。
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)
同様の状況があります-大規模な公開レコードデータベースで作業していますが、必要な日付範囲とカテゴリだけに絞ると、使用されていない列が大量にあります。一部は空白で、一部はNAです。
選択された答え: https://stackoverflow.com/a/17672737/233467 は私にとってはうまくいきませんでしたが、これはうまくいきました:
df[!sapply(df, function (x) all(is.na(x) | 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
空の意味は次のとおりです。NAまたは""
、または" "
?このような何かがうまくいくかもしれません:
df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]
これは、指定された変数を含む列を除外するように変更できるものです。
newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" |
x== "-4"} ) )]
列のインデックスがわかっている場合は、
df[,-c(3, 5, 7)]
これにより、列3、5、7が省略されます。