web-dev-qa-db-ja.com

data.frameのすべての因子レベルをリストします

str(data)を使用して、レベルのheadを取得します(1-2値)

_fac1: Factor w/ 2  levels ... :
fac2: Factor w/ 5  levels ... :
fac3: Factor w/ 20 levels ... :
val: num ...
_

with dplyr::glimpse(data)より多くの値を取得しますが、因子レベルの数/値に関する情報はありません。 data.frame内のすべての因子変数のすべてのレベル情報を自動的に取得する方法はありますか?詳細情報のある短いフォーム

_levels(data$fac1)
levels(data$fac2)
levels(data$fac3)
_

より正確には、次のようなエレガントなバージョン

_for (n in names(data))
  if (is.factor(data[[n]])) {
    print(n)
    print(levels(data[[n]]))
  }
_

クリストフ

20
ckluss

いくつかのオプションがあります。 sapplyを使用して 'data'をループし、各列のlevelsを取得します(すべての列がfactorクラスであると仮定)

sapply(data, levels)

または、パイプする必要がある場合(%>%)それ、これは次のように行うことができます

library(dplyr)
data %>% 
     sapply(levels)

または、別のオプションはsummarise_each from dplyr from levels内のfunsを指定します。

 data %>%
      summarise_each(funs(list(levels(.))))
22
akrun

より簡単な方法は、sqldfパッケージを使用して、select distinctステートメントを使用することです。これにより、因子レベルの名前を自動的に取得し、他の列/変数にレベルとして指定することが容易になります。

汎用コードスニペットは次のとおりです。

library(sqldf)
    array_name = sqldf("select DISTINCT *colname1* as '*column_title*' from *table_name*")

アイリスデータセットを使用したサンプルコード:

df1 = iris
factor1 <- sqldf("select distinct Species as 'flower_type' from df1")
factor1    ## to print the names of factors

出力:

  flower_type
1      setosa
2  versicolor
3   virginica
4
Ann Rajaram

あなたの問題が特に因子のすべてのレベルのリストを出力することである場合、私はを使用して簡単な解決策を見つけました:

一意(df $ x)

たとえば、悪名高い虹彩データセットの場合:

unique(iris $ Species)

またはpurrrを使用:

data %>% purrr:map(levels)

または、最初にすべてを因数分解する:

data %>% dplyr::mutate_all(as.factor) %>% purrr:map(levels)

そして、長さを取得する方法についての質問に答えます:

data %>% map(levels) %>% map(length)
1
Amit Kohli