2012-03-03 4 views
53

あるdata.frameを作成します。列は、私は、リストの列を追加する方法を知っているリスト

> df <- data.frame(a=1:3) 
> df$b <- list(1:1, 1:2, 1:3) 
> df 
    a  b 
1 1  1 
2 2 1, 2 
3 3 1, 2, 3 

これは動作しますが、ない:

> df <- data.frame(a=1:3, b=list(1:1, 1:2, 1:3)) 
Error in data.frame(1L, 1:2, 1:3, check.names = FALSE, stringsAsFactors = TRUE) : 
    arguments imply differing number of rows: 1, 2, 3 

なぜ?

data.frameを一度に呼び出してdf(上記)を作成する方法はありますか? ?data.frameから

答えて

68

少し目立た:

リストまたはデータフレームまたはマトリックスが渡された場合、各コンポーネントまたは列は別個の引数 (として渡された場合は「data.frame」は、それが 通りです'model.matrix'クラスの行列と 'I'によって保護されているものを除く)。

ので

data.frame(a=1:3,b=I(list(1,1:2,1:3))) 

が動作しているようです。

+6

「I」は、「オブジェクトの解釈/変換の禁止」を意味します。これは、同じオブジェクトを作成しますが、 "AsIs"がクラスのセットに追加されます。 "AsIs"クラスは実際にはdata.frame()とformula()関数で読み取られるだけです。詳細はこちら[こちら](https://stat.ethz.ch/R-manual/R-devel/library/base/html/AsIs.html)。 – pwilcox

24

あなたはdata.tablesで作業している場合は、ネイティブdata_frameコンストラクタを使用して、リストの列の作成をサポート(様々tibblestbl_dftblと呼ばれる)I()

library(data.table) 
# the following works as intended 
data.table(a=1:3,b=list(1,1:2,1:3)) 

    a  b 
1: 1  1 
2: 2 1,2 
3: 3 1,2,3 
+0

これは、 '' 'data.table'''の幅広いマージンではあまり評価されていない機能です –

15

data_frame sの呼び出しを回避することができます。それらを使用するには、tibble,dplyrまたはtidyverseのような多くのライブラリの1つをロードします。

> data_frame(abc = letters[1:3], lst = list(1:3, 1:3, 1:3)) 
# A tibble: 3 × 2 
    abc  lst 
    <chr> <list> 
1  a <int [3]> 
2  b <int [3]> 
3  c <int [3]> 

彼らは実際data.framesボンネットの下であるが、幾分改変します。それらはほとんど常に通常のdata.framesとして使用することができます。

> #no problem 
> data.frame(x = 1:3, y = 1:3) %>% class 
[1] "data.frame" 
> data.frame(x = 1:3, y = 1:3) %>% class == "data.frame" 
[1] TRUE 
> #uh oh 
> data_frame(x = 1:3, y = 1:3) %>% class 
[1] "tbl_df"  "tbl"  "data.frame" 
> data_frame(x = 1:3, y = 1:3) %>% class == "data.frame" 
[1] FALSE FALSE TRUE 
> #dont use if with improper testing! 
> if(data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" 
Warning message: 
In if (data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" : 
    the condition has length > 1 and only the first element will be used 
> #proper 
> data_frame(x = 1:3, y = 1:3) %>% inherits("data.frame") 
[1] TRUE 

私はR 4 Data Science(無料)にそれらについて読んで推薦:私が見つけた唯一の例外は、人々が不適切なクラスのチェックを行うとき、彼らは問題を引き起こすということです。

関連する問題