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


79

我知道如何添加列表列:

> 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

Answers:


101

来自?data.frame

如果将列表或数据帧或矩阵传递给“ data.frame”,则好像每个组件或列都作为单独的参数传递(“ model.matrix”类的矩阵和受“ I保护的矩阵除外)')。

(添加了重点)。

所以

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

似乎有效。


17
对于那些感兴趣的人,“ I”的意思是“禁止对象的插入/转换”。它创建一个相同的对象,但在类集后附加“ AsIs”。实际上,“ AsIs”类仅由data.frame()和Formula()函数读取。在这里了解更多。
pwilcox

2
太棒了,谢谢您的解决方案。尽管只是I为了抑制对象的
渗透

@pwilcox非常有趣。是否有某种方法可以调用对象以了解其是否受I保护?我猜是class()吗?例如I(iris) -> i; i %>% class() 3 [1] "AsIs" "data.frame"(返回AsIs类)
stevec

33

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

这是一个data.table被广泛忽视的特征
数据公主

22

data_frameS(所谓的不同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数据科学(免费)中有关它们的文章。


1
R在不断发展壮大,我认为这是2018年该问题的答案,应该以某种方式标记为R.
Fitzroy Hogsflesh

如果它足够流行,它将上升到顶部。我们很多人仍然使用基数R ...
Ben Bolker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.