R Language
길고 넓은 형태로 데이터 재 형성
수색…
소개
R에서는 테이블 형식의 데이터가 데이터 프레임에 저장됩니다. 이 주제에서는 단일 테이블을 변환하는 다양한 f}에 대해 설명합니다.
비고
재 형성 기능
데이터를 reshape
하기위한 가장 유연한 기본 R 함수는 reshape
입니다. 구문에 대해서는 ?reshape
를 참조하십시오.
# create unbalanced longitudinal (panel) data set
set.seed(1234)
df <- data.frame(identifier=rep(1:5, each=3),
location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
identifier location period counts values
1 1 up 1 4 9.186478
2 1 up 2 22 6.431116
3 1 up 3 22 6.334104
5 2 down 2 31 6.161130
6 2 down 3 23 6.583062
7 3 left 1 1 6.513467
9 3 left 3 24 5.199980
10 4 up 1 18 6.093998
12 4 up 3 20 7.628488
13 5 center 1 10 9.573291
14 5 center 2 33 9.156725
15 5 center 3 11 5.228851
data.frame은 불균형합니다. 즉, 단위 2는 첫 번째 기간에는 관측치가 누락되고, 단위 3과 4는 두 번째 기간에 관측치가 누락됩니다. 또한 기간에 따라 달라지는 두 개의 변수가 있습니다 : 개수와 값, 그리고 식별자와 위치는 다양하지 않은 두 개의 변수가 있습니다.
장황함
data.frame을 와이드 포맷으로 재 형성하려면,
# reshape wide on time variable
df.wide <- reshape(df, idvar="identifier", timevar="period",
v.names=c("values", "counts"), direction="wide")
df.wide
identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
1 1 up 9.186478 4 6.431116 22 6.334104 22
5 2 down NA NA 6.161130 31 6.583062 23
7 3 left 6.513467 1 NA NA 5.199980 24
10 4 up 6.093998 18 NA NA 7.628488 20
13 5 center 9.573291 10 9.156725 33 5.228851 11
누락 된 기간은 NAs로 채워진다.
넓은 것으로 재구성 할 때 "v.names"인수는 시간이 지남에 따라 달라지는 열을 지정합니다. 위치 변수가 필요하지 않은 경우 "drop"인수로 다시 형성하기 전에 삭제할 수 있습니다. data.frame에서 non-varying / non-id 열만 삭제할 때 v.names 인수는 필요하지 않게됩니다.
reshape(df, idvar="identifier", timevar="period", direction="wide",
drop="location")
와이드에서 롱
현재 df.wide를 사용하여 길게 변경하려면 최소한의 구문 만 사용해야합니다.
reshape(df.wide, direction="long")
그러나 일반적으로 이것은 더 까다 롭습니다.
# remove "." separator in df.wide names for counts and values
names(df.wide)[grep("\\.", names(df.wide))] <-
gsub("\\.", "", names(df.wide)[grep("\\.", names(df.wide))])
이제 간단한 구문은 정의되지 않은 열에 대한 오류를 생성합니다.
reshape
함수가 자동으로 구문 분석하기가 어려운 열 이름을 사용하면 변환을 위해 long 형식으로 특정 형식의 변수를 그룹화하기 위해 reshape
에 알려주는 "varying"인수를 추가해야 할 때가 있습니다. 이 인수는 변수 이름 또는 인덱스의 벡터 목록을 사용합니다.
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
long reshaping에서는 "v.names"인수를 사용하여 결과 변수를 바꿀 수 있습니다.
때때로의 사양을 알려주는 "9월"인수를 사용하여 피할 수있다 "변경시키는" reshape
값 인수를 지정하고 time 인수를 지정하는 어떤 변수 이름의 일부입니다.
데이터 재구성
종종 데이터가 테이블에 들어옵니다. 일반적으로이 표 형식의 데이터를 넓고 긴 형식으로 나눌 수 있습니다. 와이드 형식에서 각 변수에는 고유 한 열이 있습니다.
사람 | 높이 [cm] | 나이 [yr] |
---|---|---|
앨리슨 | 178 | 20 |
단발 | 174 | 45 |
칼 | 182 | 31 |
그러나 모든 변수가 하나의 열에 있고 그 값이 두 번째 열에있는 긴 형식을 사용하는 것이 더 편리 할 때도 있습니다.
사람 | 변하기 쉬운 | 값 |
---|---|---|
앨리슨 | 높이 [cm] | 178 |
단발 | 높이 [cm] | 174 |
칼 | 높이 [cm] | 182 |
앨리슨 | 나이 [yr] | 20 |
단발 | 나이 [yr] | 45 |
칼 | 나이 [yr] | 31 |
이 프로세스를 단순화하기 위해 Base R과 타사 패키지를 사용할 수 있습니다. 각 옵션에 대해 mtcars
데이터 집합이 사용됩니다. 기본적으로이 데이터 집합은 긴 형식입니다. 패키지가 작동하려면 행 이름을 첫 번째 열로 삽입합니다.
mtcars # shows the dataset
data <- data.frame(observation=row.names(mtcars),mtcars)
베이스 R
베이스 R에는 와이드 포맷과 long 포맷을 변환하는 데 사용할 수있는 두 가지 함수가 있습니다 : stack()
과 unstack()
.
long <- stack(data)
long # this shows the long format
wide <- unstack(long)
wide # this shows the wide format
그러나 이러한 기능은 고급 사용 사례의 경우 매우 복잡해질 수 있습니다. 다행히 타사 패키지를 사용하는 다른 옵션이 있습니다.
tidyr 꾸러미
이 패키지는 gather()
를 사용하여 wide에서 long으로 변환하고 spread()
를 사용하여 long에서 wide로 변환합니다.
library(tidyr)
long <- gather(data, variable, value, 2:12) # where variable is the name of the
# variable column, value indicates the name of the value column and 2:12 refers to
# the columns to be converted.
long # shows the long result
wide <- spread(long,variable,value)
wide # shows the wide result (~data)
data.table 패키지
data.table 패키지는 reshape2
함수를 확장하고 melt()
함수를 사용하여 와이드에서로, dcast()
에서 와이드로 이동합니다.
library(data.table)
long <- melt(data,'observation',2:12,'variable', 'value')
long # shows the long result
wide <- dcast(long, observation ~ variable)
wide # shows the wide result (~data)