簡體   English   中英

創建一個 data.frame,其中一列是一個列表

[英]Create a data.frame where a column is a list

我知道如何添加列表列:

> 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晦澀,來自?data.frame

如果將列表或數據框或矩陣傳遞給 'data.frame',就好像每個組件或列都作為單獨的參數傳遞(除了類 '"model.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))

   a     b
1: 1     1
2: 2   1,2
3: 3 1,2,3

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 ,但有些修改。 它們幾乎總是可以用作普通的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 (免費)中閱讀它們。

您可以使用list2DF創建一個data.frame其中一列是一個list

x <- list2DF(list(a=1:3, b=list(1:1, 1:2, 1:3)))
#x <- data.frame(a=1:3, list2DF(list(b=list(1:1, 1:2, 1:3)))) #Alternative

x
#  a       b
#1 1       1
#2 2    1, 2
#3 3 1, 2, 3

str(x)
#'data.frame':   3 obs. of  2 variables:
# $ a: int  1 2 3
# $ b:List of 3
#  ..$ : int 1
#  ..$ : int  1 2
#  ..$ : int  1 2 3

有了這個,你在AsIs中沒有attr data.frame ,你在使用I時會有什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM