테이블을 데이터 프레임으로 변환하는 방법


167

나는 이것을 가지고 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"

인쇄 할 때 다음과 같이 보입니다.

                    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

나는 제거 할 xy및 데이터 프레임으로 변환이 정확히 (세 개의 행, 네 개의 열) 위의 동일하지만,없는 외모 xy. 을 사용 as.data.frame(mytable)하면 대신 이것을 얻습니다.

                    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

아마도 기본적으로 테이블이 데이터 프레임과 어떻게 관련되는지 이해하지 못합니다.


2
검색 할 때 SO에서 비슷한 질문을 찾는 것이 얼마나 어려운지 놀랐습니다. 여기에 하나가 있습니다 : stackoverflow.com/questions/5855225/… 그것은 매우 기본적인 조작이며, ?xtabs(가장 분명한 위치는 아닙니다.)
IRTFM

deparse.level = 0table
Rich Scriven

답변:


322

나는 이미 알아 냈습니다.

as.data.frame.matrix(mytable) 

내가 필요한 것을 수행합니다-분명히 데이터 프레임으로 적절하게 변환하려면 테이블을 행렬로 변환해야합니다. Computational Ecology 블로그에서 우발성 테이블에 대한 as.data.frame.matrix () 함수에 대한 자세한 내용을 찾았습니다 .


31
아니면 그냥 as.data.frame(mytable). ( is.matrix(mytable)테이블은 실제로 행렬로 구성되어 있으며 행렬 인수가 전달 as.data.frame.matrix될 때 as.data.frame()전달되는 방법임을 알 수 있습니다.)
Josh O'Brien

16
Josh-상단에 표시된 예에서 as.data.frame (mytable)이 작동하지 않았습니다. 이것이 Victor가 질문하는 이유입니다. 당신은 명확히 할 수 있습니까?
헤더 스타크

4
@HeatherStark 나는 이것이 as.data.frame.table덜 구체적이지 않고 디스패치 되기 때문이라고 생각합니다 as.data.frame.matrix.
jbaums

3
아주 좋은 발견. 내가 싫어하는 유일한 것은 xtab 요소 (첫 번째 "열")가로 바뀐다는 것 row.names입니다. 나는 row.names값을 사용하여 열을 추가 할 수는 있지만 처음에는 as.data.frame.matrix글쓰기 row.names를 막 습니다 ..
Thieme Hennis

as.data.frame.matrix(table(x))는 작동 Error in seq_len(ncols) : argument must be coercible to non-negative integer하는 동안 숫자 벡터 만 제공합니다.as.data.frame(table(x))xc(1,2,...)
PatrickT

16

이 경우 열 이름이 숫자이기 때문에 결과가 다양하지만 내가 사용한 또 다른 방법은 data.frame(rbind(mytable))입니다. @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

열 이름이 숫자로 시작하지 않으면 X앞에 숫자 가 추가되지 않습니다.


이것은 실제로 오류를 반환하는 예제에서 as.data.frame.matrix보다 실제로 더 잘 작동합니다. out <-structure (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, zone7 = 351484L, zone8 = 441930L, zone9 = 25266L, zoneNA = 14751L), .Dim = 10L, .Dimnames = list (c ( "zone1", "zone2", "zone3", "zone4", "zone5 ","zone6 ","zone7 ","zone8 ","zone9 ","zoneNA ")), 클래스 ="table ")> as.data.frame.matrix (out) d [[2L]]의 오류 : 아래 첨자
cmbarbu

11

짧은 대답 : as.data.frame.matrix(mytable)@Victor Van Hee이 제안한대로을 사용 합니다.

긴 대답 : 반환 하더라도 함수에 as.data.frame(mytable)의해 생성 된 우발성 테이블에서는 작동하지 않을 수 있습니다 . 여전히 테이블을 형식 으로 녹 입니다.table()is.matrix(your_table)TRUEfactor1 factor2 factori counts

예:

> 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

tidyverse를 사용하는 경우

as_data_frame(table(myvector))

티블 을 얻는 (즉, 기본 클래스에서 약간의 변형이있는 데이터 프레임)


데이터 프레임 또는 티블 작업에 사용하려는 작업에 따라 다름
Dimitrios Zacharatos

-1

이건 대박이다

as.data.frame (mytable)

대신 이것을 사용하십시오

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


1
convert정규 R 분포의 일부가 아닙니다. 이 could not find function "convert"라이브러리에 필요한 라이브러리가 있습니까?
Mark Lakata
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.