수색…


소개

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)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow