创build一个列是列表的data.frame
我知道如何添加列表列:
> df <- data.frame(a=1:3) > df$b <- list(1:1, 1:2, 1:3) > df ab 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
为什么?
另外,有没有办法创builddata.frame
(上)在一个单一的调用data.frame
?
?data.frame
晦涩,从?data.frame
:
如果列表或数据框架或matrix被传递给“data.frame”,就好像每个组件或列都作为单独的parameter passing(除了“model.matrix”类的matrix和“I “)。
所以
data.frame(a=1:3,b=I(list(1,1:2,1:3)))
似乎工作。
如果你正在使用data.tables
,那么你可以避免调用I()
library(data.table) # the following works as intended data.table(a=1:3,b=list(1,1:2,1:3)) ab 1: 1 1 2: 2 1,2 3: 3 1,2,3
data_frame
s(不同地称为tibbles
, tbl_df
, tbl
)本地支持使用data_frame
构造函数创build列表列。 要使用它们,请加载其中的一个库,如dplyr
, dplyr
或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
。 我发现唯一的例外是,当人们进行不适当的class级检查时,会造成问题:
> #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
我build议阅读关于他们在R 4数据科学 (免费)。