sourcetip

data.frame을 사용해야 합니까, 아니면 matrix를 사용해야 합니까?

fileupload 2023. 6. 22. 22:09
반응형

data.frame을 사용해야 합니까, 아니면 matrix를 사용해야 합니까?

언제 사용해야 합니까?data.frame그리고 언제를 사용하는 것이 더 낫습니까?matrix?

둘 다 직사각형 형식으로 데이터를 보관하기 때문에 때때로 불분명합니다.

어떤 데이터 유형을 사용해야 하는지에 대한 일반적인 경험칙이 있습니까?

답변의 일부가 이미 질문에 포함되어 있습니다.열(변수)이 서로 다른 유형(숫자/문자/논리 등)으로 예상되는 경우 데이터 프레임을 사용합니다.행렬은 같은 유형의 데이터에 대한 것입니다.

따라서 선택 행렬/data.frame은 동일한 유형의 데이터가 있는 경우에만 문제가 됩니다.

답은 data.frame/matrix의 데이터로 수행할 작업에 따라 달라집니다.다른 함수로 전달될 경우 이러한 함수의 인수 유형에 따라 선택이 결정됩니다.

또한:

매트릭스는 메모리 효율성이 더 높습니다.

m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes

선형 대수 유형의 연산을 수행하려는 경우 행렬이 필요합니다.

데이터 프레임은 이름으로 열을 자주 참조하는 경우(콤팩트 $ 연산자를 통해) 더 편리합니다.

또한 데이터 프레임은 각 열에 별도로 서식을 적용할 수 있기 때문에 표 형식 정보를 보고(인쇄)하는 데도 IMHO가 더 좋습니다.

@Michal이 언급하지 않은 것은 행렬이 동등한 데이터 프레임보다 작을 뿐만 아니라 행렬을 사용하면 데이터 프레임을 사용하는 것보다 코드를 훨씬 더 효율적으로 만들 수 있다는 것입니다.이것이 내부적으로 많은 R 함수가 데이터 프레임에 있는 데이터를 행렬화하도록 강제하는 한 가지 이유입니다.

데이터 프레임은 종종 훨씬 더 편리합니다. 항상 원자 덩어리의 데이터만 있는 것은 아닙니다.

문자 행렬을 가질 수 있습니다. R에 행렬을 만들기 위해 숫자 데이터만 있을 필요는 없습니다.

데이터 프레임을 행렬로 변환할 때, 다음과 같은 요소가 있다는 것에 유의하십시오.data.matrix()내부 수준을 기준으로 요인을 숫자 값으로 변환하여 적절하게 처리하는 함수입니다.을 통해 강제 실행as.matrix()요인 레이블 중 하나라도 비구분적이면 문자 행렬이 생성됩니다.비교:

> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a   B  
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
     a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6

단순한 숫자 변수 이상의 데이터를 사용하는 경우가 많기 때문에 데이터 분석 작업에 거의 항상 데이터 프레임을 사용합니다.패키지에 대한 함수를 코딩할 때 거의 항상 강제로 매트릭스화한 다음 결과를 데이터 프레임으로 다시 포맷합니다.데이터 프레임이 편리하기 때문입니다.

@Michal: 매트릭스는 실제로 메모리 효율성이 높지 않습니다.

m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes

열 수가 많지 않은 경우:

m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes

행렬은 실제로 추가 방법이 있는 벡터입니다.data.frame은 목록입니다.차이는 벡터 대 목록에 있습니다.계산 효율성을 위해 행렬을 사용합니다.필요한 경우 data.frame을 사용합니다.

둘 사이의 효율성 차이는 더 이상 강조할 수 없습니다!DF가 특히 데이터 분석 사례에서 더 편리한 것은 사실이지만, 이기종 데이터도 허용하고 일부 라이브러리만 허용합니다. 특정 작업에 대해 일회성 코드를 작성하지 않는 한 이러한 모든 것은 실제로 부차적입니다.

예를 하나 들어보죠.MCMC 방법의 2D 경로를 계산하는 함수가 있었습니다.기본적으로, 이것은 우리가 초기 지점(x,y)을 취하고, 각 단계에서 새로운 지점(x,y)을 찾기 위해 특정 알고리즘을 반복하여 전체 경로를 이렇게 구성한다는 것을 의미합니다.알고리즘은 매우 복잡한 함수를 계산하고 각 반복에서 일부 랜덤 변수를 생성하는 것을 포함하기 때문에 12초 동안 실행할 때 각 단계에서 수행하는 작업량을 고려하면 괜찮다고 생각했습니다.즉, 함수는 3열 data.frame의 목적 함수 값과 함께 생성된 경로의 모든 점을 수집했습니다.따라서 3개의 열은 그리 크지 않고, 단계 수도 합리적인 10,000개 이상이었습니다(이런 종류의 문제에서는 1,000,000개의 경로가 일반적이므로 10,000개는 아무것도 아닙니다).그래서 저는 DF 10,000x3는 절대 문제가 되지 않는다고 생각했습니다.DF가 사용된 이유는 간단합니다.함수를 호출한 후 ggplot()을 호출하여 결과 (x,y)-경로를 그립니다.ggplot()은 행렬을 허용하지 않습니다.

그러던 어느 순간, 호기심에서 행렬의 경로를 수집하기 위해 함수를 바꾸기로 결정했습니다.기쁘게도 DF와 매트릭스의 구문은 유사합니다. 제가 한 것은 df를 data.frame으로 지정한 라인을 matrix로 초기화하는 라인으로 변경한 것뿐입니다.여기서 나는 또한 초기 코드에서 DF가 최종 크기를 갖도록 초기화되었기 때문에 나중에 함수 코드에서 새로운 값만 이미 할당된 공간에 기록되었고, DF에 새 행을 추가하는 오버헤드가 발생하지 않았다는 것을 언급해야 합니다.이것은 비교를 훨씬 더 공정하게 만들고, 함수에서 더 이상 아무것도 다시 쓸 필요가 없기 때문에 제 일을 더 간단하게 만들었습니다.필요한 크기의 data.frame을 처음 할당할 때부터 동일한 크기의 행렬로 한 줄만 변경하면 됩니다.함수의 새 버전을 ggplot()에 적용하기 위해 ggplot()을 사용하여 현재 반환된 행렬을 data.frame으로 변환했습니다.

코드를 다시 실행한 후 결과를 믿을 수 없었습니다.코드는 몇 분의 1초 안에 실행됩니다!한 12초 대신에.그리고 다시 말하지만, 10,000번 반복하는 동안 함수는 DF(그리고 지금은 매트릭스)에서 이미 할당된 공간에 값을 읽고 쓸 뿐입니다.또한 이 차이는 10000x3 크기의 합리적인(또는 다소 작은) 차이이기도 합니다.

따라서 DF를 사용하는 유일한 이유가 ggplot()과 같은 라이브러리 함수와 호환되도록 하기 위해서라면 언제든지 마지막 순간에 DF로 변환할 수 있습니다. 즉, 편리하다고 생각되는 한 매트릭스로 작업할 수 있습니다.반면에 행렬에서 DF로 지속적으로 변환해야 하는 일부 데이터 분석 패키지를 사용하거나, 직접 집중적인 계산을 수행하지 않고 표준 패키지만 사용하는 등 DF를 사용해야 하는 보다 실질적인 이유가 있다면,그들이 그들의 일을 하고 나서 결과를 다시 변환합니다. 그래서 그들은 당신을 위해 모든 효율성 작업을 합니다.) 또는 당신이 신경 쓰지 않고 DF에 더 편안함을 느낄 수 있도록 일회성 작업을 합니다. 그러면 당신은 효율성에 대해 걱정하지 말아야 합니다.

또는 다른 더 실용적인 규칙: OP와 같은 질문이 있는 경우, 행렬을 사용하십시오. 따라서 그러한 질문이 없을 때만 DF를 사용합니다(이미 DF를 사용해야 한다는 것을 알고 있거나 코드가 일회성이기 때문에 실제로는 관심이 없기 때문입니다)

그러나 일반적으로 이 효율성 문제를 우선 순위로 항상 염두에 두어야 합니다.

행렬과 데이터 프레임은 직사각형 2D 배열이며 행과 열별로 이질적일 수 있습니다.일부 방법과 속성을 공유하지만 모두 공유하지는 않습니다.

예:

M <- list(3.14,TRUE,5L,c(2,3,5),"dog",1i)  # a list
dim(M) <- c(2,3)                           # set dimensions
print(M)                                   # print result

#      [,1]  [,2]      [,3]
# [1,] 3.14  5         "dog"
# [2,] TRUE  Numeric,3 0+1i

DF <- data.frame(M)                   # a data frame
print(DF)                             # print result

#      X1      X2   X3
#  1 3.14       5  dog
#  2 TRUE 2, 3, 5 0+1i

M <- matrix(c(1,1,1,1,2,3,1,3,6),3)   # a numeric matrix
DF <- data.frame(M)                   # a all numeric data frame

solve(M)                              # obtains inverse matrix
solve(DF)                             # obtains inverse matrix
det(M)                                # obtains determinant
det(DF)                               # error

언급URL : https://stackoverflow.com/questions/5158790/should-i-use-a-data-frame-or-a-matrix

반응형