web-dev-qa-db-ja.com

列がリストである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の1回の呼び出しでdf(上記)を作成する方法はありますか?

65
flodel

?data.frameから少しわかりにくいです:

リストまたはデータフレームまたはマトリックスが 'data.frame'に渡される場合、各コンポーネントまたは列が個別の引数として渡されたかのようになります(クラス '"model.matrix"'のマトリックスおよび 'I ')。

そう

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

動作するようです。

84
Ben Bolker

_data.tables_を使用している場合、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
_
30
mnel

data_frames(さまざまなtibblestbl_dftblと呼ばれます)は、data_frameコンストラクターを使用したリスト列の作成をネイティブにサポートします。これらを使用するには、 tibbledplyr、またはtidyverseなどの多くのライブラリのいずれかをロードします。

> 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(無料)でそれらについて読むことをお勧めします。

18
Deleet