Bir tabloyu veri çerçevesine dönüştürme


167

I-si olmak bu bir tablo R str():

 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"

Ve yazdırdığımda şöyle görünüyor:

                    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

Ben xve kurtulmak yve yukarıdaki ile tam olarak aynı görünüyor bir veri çerçevesine dönüştürmek istiyorum (üç satır, dört sütun), ama xveya olmadan y. Eğer kullanırsam as.data.frame(mytable), bunun yerine şunu elde ederim:

                    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

Muhtemelen temelde tabloların veri çerçeveleri ile nasıl ilişkili olduğunu anlamıyorum.


2
Arama yaparken SO hakkında benzer bir soru bulmanın ne kadar zor olduğuna şaşırdım. İşte bir tane: stackoverflow.com/questions/5855225/… Oldukça basit bir manevra ve açıklandığı gibi ?xtabs(bu mutlaka en açık konum değil.)
IRTFM

Oldukça emin yapmanız gereken tüm ayarlanır deparse.level = 0çağrısında (2 ya da muhtemelen)table
Zengin Scriven

Yanıtlar:


322

Ben zaten anladım:

as.data.frame.matrix(mytable) 

İhtiyacım olan şeyi yapıyor - görünüşe göre, tablo bir şekilde uygun bir veri çerçevesine çevrilmek için bir matrise dönüştürülmelidir. Hesaplamalı Ekoloji blogunda olasılık tabloları için bu as.data.frame.matrix () işlevi hakkında daha fazla ayrıntı buldum .


31
Veya sadece as.data.frame(mytable). ( is.matrix(mytable)tabloların gerçekten sadece matrisler giyinmiş as.data.frame.matrixolduğunu ve as.data.frame()bir matris argümanından geçtiğinde gönderilen yöntem olduğunu ortaya çıkaracaktır .)
Josh O'Brien

16
Josh - yukarıda gösterilen örnekte, as.data.frame (mytable) işe yaramadı - bu yüzden Victor soruyu soruyordu, diye düşündüm? Açıklığa kavuşturabilir misiniz?
Heather Stark

4
@HeatherStark Bunun aslında as.data.frame.tabledaha az spesifik olmaktan ziyade gönderilmekte olduğundan şüpheleniyorum as.data.frame.matrix.
jbaums

3
çok güzel bulmak. sevmediğim tek şey xtab faktörlerimin (ilk "sütun") dönüşmesidir row.names. row.namesDeğerleri kullanarak bir sütun eklemeyi başardım , ama ilk etapta as.data.frame.matrixyazmayı row.names
öneriyorum

as.data.frame.matrix(table(x))verirken Error in seq_len(ncols) : argument must be coercible to non-negative integer, çalışırken , sadece sayısal bir vektör as.data.frame(table(x))neredexc(1,2,...)
PatrickT

16

Sütun adları sayı olduğu için bu durumda sonuçlar değişse de, kullandığım başka bir yol data.frame(rbind(mytable)). @XX'teki örneği kullanarak:

> 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

Sütun adları sayılarla başlamazsa X, önüne eklenmez.


Bu aslında bir hata döndüren örneğimde as.data.frame.matrix'ten daha iyi çalışıyor: dışarı <- yapısı (c (bölge1 = 1208160L, bölge2 = 1126841L, bölge3 = 2261808L, bölge4 = 1827557L, bölge5 = 1038999L, bölge6 = 353569L, bölge7 = 351484L, bölge8 = 441930L, bölge9 = 25266L, bölgeNA = 14751L), .Dim = 10L, .Dimnames = liste (c ("bölge1", "bölge2", "bölge3", "bölge4", "bölge5 "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), class =" table ")> as.data.frame.matrix (out) d [[2L]] içinde hata: sınır dışı abonelik
cmbarbu

11

Kısa cevap: as.data.frame.matrix(mytable)@Victor Van Hee'nin önerdiği gibi.

Uzun cevap: as.data.frame(mytable)tarafından oluşturulan acil durum tabloları çalışmayabilir table()bile işlevi is.matrix(your_table)getiri TRUE. Yine de tablonuzu factor1 factor2 factori countsformata eritecektir .

Misal:

> 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

Eğer kullanıyorsanız tidyverse kullanabileceğiniz

as_data_frame(table(myvector))

bir tibble elde etmek (yani temel sınıftan bazı küçük varyasyonlar içeren bir veri çerçevesi)


veri çerçeveleri veya tibbles ile çalışmak istediğinize bağlıdır
Dimitrios Zacharatos

-1

Bu karmaşık

as.data.frame (mytable)

Bunun yerine bunu kullanın

kitaplığı ( "quanteda")

convert (mytable, to = "data.frame")


1
convertnormal R dağılımının bir parçası değildir. Bunun için could not find function "convert"hangi kütüphaneye ihtiyacınız var ?
Mark Lakata

kitaplığı ("quanteda")
Odeyinka Olubunmi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.