データフレーム内のすべての列のクラスを取得するにはどうすればよいですか?


85

データフレーム内の各列がどのクラスであるかを確認する簡単な方法は何ですか?

回答:


92

1つのオプションは使用することですlapplyclass。例えば:

> foo <- data.frame(c("a", "b"), c(1, 2))
> names(foo) <- c("SomeFactor", "SomeNumeric")
> lapply(foo, class)
$SomeFactor
[1] "factor"

$SomeNumeric
[1] "numeric"

別のオプションはstr

> str(foo)
'data.frame':   2 obs. of  2 variables:
 $ SomeFactor : Factor w/ 2 levels "a","b": 1 2
 $ SomeNumeric: num  1 2

10
オブジェクトが継承するすべてのクラスのclass文字ベクトルを返すため、の出力はリストである可能性があり、ほとんどの人が期待するような文字ベクトルであるとは限りません。これは少し危険かもしれません...私ははるかに安全だと思います。sapply(foo, class)lapply
flodel 2012年

1
読みやすくするために、私が提案unlist(lapply(foo, class))するのは、列の多いデータフレームで便利です。
p130ter

1
unlistwithlapplyはひどい考えです。なぜならlength(class(x))>1 (上記のコメントを参照)-sapplyよりもはるかに安全である可能性があるからunlist + lapplyです。安全な方法はされるだろうsapply(lapply(foo, class), "[", 1)- fooがデータフレームであることを考える
lebatsnok

28

簡単に利用しlapplyたり、sapply組み込み関数を使用したりできます。

lapplyあなたに返されますlist-

lapply(dataframe,class)

一方sapply、可能な限り最良の戻り値の型を取ります。ベクトルなど-

sapply(dataframe,class)

どちらのコマンドも、すべての列名とそれぞれのクラスを返します。


1

こんにちは、同じものを探していました、そしてそれはまたかもしれません

unlist(lapply(mtcars,class))

0

ファミリー機能purrrと同様に使用することもできますapply

as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)

0

を使用した上記の優れた回答よりもコンパクトな出力が必要だったlapplyので、小さな関数としてラップされた代替案を次に示します。

# Example data
df <-
    data.frame(
        w = seq.int(10),
        x = LETTERS[seq.int(10)],
        y = factor(letters[seq.int(10)]),
        z = seq(
            as.POSIXct('2020-01-01'),
            as.POSIXct('2020-10-01'),
            length.out = 10
        )
    )

# Function returning compact column classes
col_classes <- function(df) {
    t(as.data.frame(lapply(df, function(x) paste(class(x), collapse = ','))))
}

# Return example data's column classes
col_classes(df)
  [,1]            
w "integer"       
x "character"     
y "factor"        
z "POSIXct,POSIXt"

結果を1列の行列にしますか?どうして?代わりに文字ベクトルはどうですか?
nbenn

確かに、1列の行列を返さないのはなぜですか?このソリューションはコンパクトな出力用であり、たとえばdata.frameを操作した後にチェックに戻るのに役立ちます。列クラスのダウンストリーム処理に使用するためのものではありません。上記の他の回答は文字ベクトルを返します。
アレック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.