[r] 긴 형식에서 넓은 형식으로 데이터를 재구성하는 방법

다음 데이터 프레임을 다시 정렬하는 데 문제가 있습니다.

set.seed(45)
dat1 <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )

dat1
       name  numbers      value
1  firstName       1  0.3407997
2  firstName       2 -0.7033403
3  firstName       3 -0.3795377
4  firstName       4 -0.7460474
5 secondName       1 -0.8981073
6 secondName       2 -0.3347941
7 secondName       3 -0.5013782
8 secondName       4 -0.1745357

각 고유 한 “name”변수가 행 이름이되도록 행 이름을 바꾸고 싶습니다. “values”는 해당 행을 따라 관측 값이되고 “numbers”는 colnames입니다. 이런 종류의 :

     name          1          2          3         4
1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

내가 검토 한 meltcast및 몇 가지 다른 것들, 그러나 아무도이 일을 할 것 없습니다.



답변

reshape기능 사용하기 :

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")


답변

새로운 (2014 년) tidyr패키지도 함께 간단하게이 작업을 수행 gather()/ spread()에 대한 조항 인 melt/을 cast.

편집 : 자, 2019 년, tidyr V 1.0이 출시 설정 한 spreadgather더 이상 사용되지 경로 대신 선호 pivot_wider하고 pivot_longer당신이 설명 찾을 수있는 이 답변에 . 의 짧은 인생을 간략하게 살펴보고 싶다면 계속 읽으십시오 spread/gather.

library(tidyr)
spread(dat1, key = numbers, value = value)

에서 github에 ,

tidyr의 프레이밍입니다 reshape2깔끔한 데이터 프레임 워크를 동반하도록 설계, 작업 손으로 손에로 magrittrdplyr데이터 분석을위한 견고한 파이프 라인을 구축하는.

그냥 같은 reshape2모양 변경보다 덜했다, tidyr이하 않습니다 reshape2. 일반적인 형태 변경 reshape2이나 형태 변경이 이루어진 일반적인 집계가 아닌 데이터 정리를 위해 특별히 설계되었습니다 . 특히 기본 제공 방법은 데이터 프레임에서만 작동하며 tidyr여백이나 집계를 제공하지 않습니다.


답변

reshape()기능 또는 형태 변경 패키지 의 melt()/ cast()기능을 사용 하여이 작업을 수행 할 수 있습니다 . 두 번째 옵션의 경우 예제 코드는

library(reshape)
cast(dat1, name ~ numbers)

또는 사용 reshape2

library(reshape2)
dcast(dat1, name ~ numbers)


답변

성능이 문제가 될 경우 또 다른 옵션은 data.table의 확장 reshape2기능을 사용하는 것입니다.

( 참조 : data.tables를 사용하여 효율적인 재 형성 )

library(data.table)

setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")

#          name          1          2         3         4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814

그리고 data.table v1.9.6부터 여러 열에 캐스트 할 수 있습니다

## add an extra column
dat1[, value2 := value * 2]

## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))

#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627


답변

예제 데이터 프레임을 사용하여 다음을 수행 할 수 있습니다.

xtabs(value ~ name + numbers, data = dat1)


답변

다른 두 가지 옵션 :

기본 패키지 :

df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df

sqldf 꾸러미:

library(sqldf)
sqldf('SELECT name,
      MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1,
      MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
      MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
      MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
      FROM dat1
      GROUP BY name')


답변

기본 R aggregate기능 사용 :

aggregate(value ~ name, dat1, I)

# name           value.1  value.2  value.3  value.4
#1 firstName      0.4145  -0.4747   0.0659   -0.5024
#2 secondName    -0.8259   0.1669  -0.8962    0.1681