创建一个data.frame,其中列是列表

时间:2012-03-03 16:04:57

标签: r list dataframe

我知道如何添加列表列:

> 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

为什么呢?

另外,有没有办法在df的一次调用中创建data.frame(上方)?

3 个答案:

答案 0 :(得分:82)

略显模糊,来自?data.frame

  

如果将列表或数据框或矩阵传递给'data.frame',则为   如果每个组件或列已作为单独的参数传递   (除了“model.matrix”类的矩阵和受其保护的那些矩阵   “I”)。

所以

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

似乎有效。

答案 1 :(得分:30)

如果您使用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

答案 2 :(得分:18)

data_frame s(不同地称为tibblestbl_dftbl)本身支持使用data_frame构造函数创建列表列。要使用它们,请加载其中一个库,例如tibbledplyrtidyverse

> 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 (免费)中阅读相关内容。