Cách chuyển đổi bảng thành khung dữ liệu


167

Tôi có một bảng trong R có str()cái này:

 table [1:3, 1:4] 0.166 0.319 0.457 0.261 0.248 ...
 - attr(*, "dimnames")=List of 2
  ..$ x: chr [1:3] "Metro >=1 million" "Metro <1 million" "Non-Metro Counties"
  ..$ y: chr [1:4] "q1" "q2" "q3" "q4"

Và trông như thế này khi tôi in nó:

                    y
x                           q1        q2        q3        q4
  Metro >=1 million  0.1663567 0.2612212 0.2670441 0.3053781
  Metro <1 million   0.3192857 0.2480012 0.2341030 0.1986102
  Non-Metro Counties 0.4570341 0.2044960 0.2121102 0.1263597

Tôi muốn thoát khỏi xyvà chuyển đổi nó vào một khung dữ liệu mà vẻ bề ngoài giống hệt như trên (ba hàng, bốn cột), nhưng không có xhoặc y. Nếu tôi sử dụng as.data.frame(mytable), thay vào đó tôi nhận được điều này:

                    x  y      Freq
1   Metro >=1 million q1 0.1663567
2    Metro <1 million q1 0.3192857
3  Non-Metro Counties q1 0.4570341
4   Metro >=1 million q2 0.2612212
5    Metro <1 million q2 0.2480012
6  Non-Metro Counties q2 0.2044960
7   Metro >=1 million q3 0.2670441
8    Metro <1 million q3 0.2341030
9  Non-Metro Counties q3 0.2121102
10  Metro >=1 million q4 0.3053781
11   Metro <1 million q4 0.1986102
12 Non-Metro Counties q4 0.1263597

Về cơ bản, tôi có thể không hiểu làm thế nào các bảng liên quan đến khung dữ liệu.


2
Khi tìm kiếm tôi đã ngạc nhiên về việc khó tìm thấy một câu hỏi tương tự trên SO. Đây là: stackoverflow.com/questions/5855225/ Từ Đó là một thao tác khá cơ bản và được mô tả trong ?xtabs(không nhất thiết phải là vị trí rõ ràng nhất.)
IRTFM

Khá chắc chắn rằng tất cả những gì bạn cần làm là đặt deparse.level = 0(hoặc có thể là 2) trong lệnh gọi tớitable
Rich Scriven

Câu trả lời:


322

Tôi đã tìm ra nó rồi:

as.data.frame.matrix(mytable) 

thực hiện những gì tôi cần - rõ ràng, bảng cần bằng cách nào đó được chuyển đổi thành ma trận để được dịch một cách thích hợp thành khung dữ liệu. Tôi đã tìm thấy nhiều chi tiết hơn về hàm as.data.frame.matrix () này cho các bảng dự phòng tại blog Sinh thái tính toán .


31
Hoặc chỉ as.data.frame(mytable). ( is.matrix(mytable)sẽ tiết lộ rằng các bảng thực sự chỉ là ma trận mặc quần áo và as.data.frame.matrixlà phương thức được gửi đi khi as.data.frame()được thông qua một đối số ma trận.)
Josh O'Brien

16
Josh - trong ví dụ hiển thị ở trên cùng, as.data.frame (mytable) đã không hoạt động - đó là lý do tại sao Victor đã đặt câu hỏi, tôi nghĩ sao? Bạn có thể làm rõ?
Heather Stark

4
@HeatherStark Tôi nghi ngờ điều này là vì thực tế as.data.frame.tablenó đang được gửi đi, chứ không phải là ít cụ thể hơn as.data.frame.matrix.
jbaums

3
tìm rất tốt điều duy nhất tôi không thích là các yếu tố xtab của tôi ("cột" đầu tiên) biến thành row.names. Tôi đã quản lý để thêm một cột bằng cách sử dụng các row.namesgiá trị, nhưng tôi không ngăn việc as.data.frame.matrixviết row.namesở vị trí đầu tiên ..
Thieme Hennis

as.data.frame.matrix(table(x))cho tôi Error in seq_len(ncols) : argument must be coercible to non-negative integer, trong khi as.data.frame(table(x))làm việc, nơi xchỉ là một vectơ sốc(1,2,...)
PatrickT

16

Mặc dù kết quả khác nhau trong trường hợp này vì tên cột là số, một cách khác tôi đã sử dụng là data.frame(rbind(mytable)). Sử dụng ví dụ từ @XX:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)

> freq_t
   gear
cyl  3  4  5
  4  1  8  2
  6  2  4  1
  8 12  0  2

> data.frame(rbind(freq_t))
  X3 X4 X5
4  1  8  2
6  2  4  1
8 12  0  2

Nếu tên cột không bắt đầu bằng số, Xsẽ không được thêm vào phía trước chúng.


Điều này cũng thực sự hoạt động tốt hơn as.data.frame.matrix trong ví dụ của tôi trả về lỗi: out <- architecture (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L = 353569L, vùng7 = 351484L, vùng8 = 441930L, vùng9 = 25266L, vùngNA ​​= 14751L), .Dim = 10L, .Dimnames = list (c ("vùng1", "vùng 2", "vùng 3", "vùng 3" "" đăng ký ra khỏi giới hạn
cmbarbu

11

Câu trả lời ngắn: sử dụng as.data.frame.matrix(mytable), như @Victor Van Hee đề xuất.

Câu trả lời dài: as.data.frame(mytable)có thể không hoạt động trên các bảng dự phòng được tạo bởi table()hàm, ngay cả khi is.matrix(your_table)trả về TRUE. Nó vẫn sẽ làm tan chảy bảng của bạn thành factor1 factor2 factori countsđịnh dạng.

Thí dụ:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)

> freq_t
   gear
cyl  3  4  5
  4  1  8  2
  6  2  4  1
  8 12  0  2

> is.matrix(freq_t)
[1] TRUE

> as.data.frame(freq_t)
  cyl gear Freq
1   4    3    1
2   6    3    2
3   8    3   12
4   4    4    8
5   6    4    4
6   8    4    0
7   4    5    2
8   6    5    1
9   8    5    2
> as.data.frame.matrix(freq_t)
   3 4 5
4  1 8 2
6  2 4 1
8 12 0 2

7

Nếu bạn đang sử dụng tidyverse , bạn có thể sử dụng

as_data_frame(table(myvector))

để có được một tibble (tức là một khung dữ liệu với một số biến thể nhỏ từ lớp cơ sở)


phụ thuộc vào những gì bạn muốn làm việc với dataframes hoặc tibble
Dimitrios Zacharatos

-1

Điều này thật khó hiểu

as.data.frame (mytable)

Thay vào đó hãy sử dụng cái này

chuyển đổi (mytable, to = "data.frame")


1
convertkhông phải là một phần của phân phối R bình thường. Tôi có could not find function "convert"Thư viện nào bạn cần cho việc này?
Đánh dấu Lakata
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.