2012-03-03 4 views
53

tôi biết làm thế nào để thêm một cột danh sách:Tạo một data.frame nơi một cột là một danh sách

> 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 

này hoạt động, nhưng không:

> 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 

Tại sao?

Ngoài ra, có cách nào để tạo df (ở trên) trong một cuộc gọi đến data.frame không?

Trả lời

68

Hơi obscurely, từ ?data.frame:

Nếu một danh sách hoặc dữ liệu khung hoặc ma trận được truyền cho 'data.frame' nó là như nếu mỗi thành phần hoặc cột đã được thông qua như là một đối số riêng biệt (ngoại trừ ma trận của lớp '' model.matrix '' và các ma trận được bảo vệ bởi 'I').

Vì vậy

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

dường như làm việc.

+6

Đối với những người quan tâm, "tôi" có nghĩa là "Ức chế sự tương tác/chuyển đổi đối tượng". Nó tạo ra một đối tượng giống hệt nhau nhưng với "AsIs" nối thêm vào tập các lớp. Lớp "AsIs" thực sự chỉ được đọc bởi các hàm data.frame() và công thức(). Tìm hiểu thêm [tại đây] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/AsIs.html). – pwilcox

24

Nếu bạn đang làm việc với data.tables, sau đó bạn có thể tránh được những cuộc gọi đến 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 
+0

Đây là một tính năng được đánh giá thấp của '' 'data.table''' bằng một lề rộng –

15

data_frame s (khác nhau như gọi tibbles, tbl_df, tbl) natively hỗ trợ việc tạo ra các cột danh sách bằng cách sử dụng constructor data_frame. Để sử dụng chúng, hãy tải một trong nhiều thư viện với chúng như tibble, dplyr hoặc 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]> 

Chúng thực sự là data.frames dưới mui xe, nhưng được sửa đổi một chút. Chúng hầu như luôn được sử dụng như bình thường data.frames. Ngoại lệ duy nhất tôi đã tìm thấy là khi người làm kiểm tra lớp không phù hợp, họ gây ra vấn đề:

> #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 

Tôi đề nghị đọc về họ trong R 4 Data Science (miễn phí).