2011-03-13 2 views
8

이것은 Stata가 한 단계로 처리하는 데이터 분석의 기본 문제입니다.여러 변수와 시간이 일정하지 않은 와이드에서 패널로 데이터 프레임 변경

d1 <- data.frame(subject = c("id1", "id2"), 
x0 = c("male", "female"), 
x1_2000 = 1:2, 
x1_2005 = 5:6, 
x2_2000 = 1:2, 
x2_2005 = 5:6  
) 

s.t. :

은 2000 년과 2005 년 (X1, X2) 시간 불변 데이터 (X0)와 시간 변화 데이터를 다양한 데이터 프레임을 생성

 subject  x0 time x1 x2 
1  id1 male 2000 1 1 
2  id2 female 2000 2 2 
3  id1 male 2005 5 5 
4  id2 female 2005 6 6 

내가 reshape s.t.하여이 작업을 수행 할 수 있습니다 : 데이터는 다음과 같습니다 있도록

subject x0 x1_2000 x1_2005 x2_2000 x2_2005 
1  id1 male   1  5  1  5 
2  id2 female  2  6  2  6 

나는 패널처럼 형성 할

d2 <-reshape(d1, 
idvar="subject", 
varying=list(c("x1_2000","x1_2005"), 
    c("x2_2000","x2_2005")), 
    v.names=c("x1","x2"), 
    times = c(2000,2005), 
    direction = "long", 
    sep= "_") 

내 관심사는 수십 개의 변수가있을 때 위의 명령이 매우 길어지는 것입니다. stata에서 하나는 단순히 입력합니다 : R 이러한 간단한 해결책은

reshape long x1 x2, i(subject) j(year) 

있습니까?

library(reshape2) 
library(stringr) 

# it is always useful to start with melt 
d2 <- melt(d1, id=c("subject", "x0")) 

# redefine the time and x1, x2, ... separately 
d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
        variable = str_replace(variable, "_.*$", "")) 

# finally, cast as you want 
d3 <- dcast(d2, subject+x0+time~variable) 

이제 당신도 지정 X1과 X2가 필요하지 않습니다 :

답변

12

reshape는 인수의 많은 것을 추측 할 수 있습니다
이 코드는 변수가 증가 작동합니다. 이 경우 다음을 지정하는 것으로 충분합니다. 패키지가 사용되지 않습니다.

reshape(d1, dir = "long", varying = 3:6, sep = "_") 

제공 :

 subject  x0 time x1 x2 id 
1.2000  id1 male 2000 1 1 1 
2.2000  id2 female 2000 2 2 2 
1.2005  id1 male 2005 5 5 1 
2.2005  id2 female 2005 6 6 2 
+0

니스! 하지만 변수 이름이 _sample_1_2000_이라고하면 어떻게됩니까? 'sep ='옵션으로 더 많은 spjhistic을 만들 수 있습니까? – Fred

+2

@Fred,'sep' 대신'split' 인수를 사용하십시오. 즉,'reshape (d1, dir = "long", varying = 3 : 6, split = list (regexp = "_2", include = TRUE)) 이 경우를''reshape (setNames (d1, sub ("sample_", "", names (d1))), dir = "long", varying = 3 : 6, sep = "_")' –

4

여기 reshape2 패키지를 사용하여 간단한 예이다.

> d1 <- data.frame(subject = c("id1", "id2"), x0 = c("male", "female"), 
+ x1_2000 = 1:2, 
+ x1_2005 = 5:6, 
+ x2_2000 = 1:2, 
+ x2_2005 = 5:6, 
+ x3_2000 = 1:2, 
+ x3_2005 = 5:6, 
+ x4_2000 = 1:2, 
+ x4_2005 = 5:6 
+) 
> 
> d2 <- melt(d1, id=c("subject", "x0")) 
> d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
+      variable = str_replace(variable, "_.*$", "")) 
> 
> d3 <- dcast(d2, subject+x0+time~variable) 
> 
> d3 
    subject  x0 time x1 x2 x3 x4 
1  id1 male 2000 1 1 1 1 
2  id1 male 2005 5 5 5 5 
3  id2 female 2000 2 2 2 2 
4  id2 female 2005 6 6 6 6 
+0

덕분에,이 유용합니다. 'transform'이 무엇을하고 있는지 명확하지 않으며 (도움 파일이별로 도움이되지 않습니다.)''^. * _ "'과'". * $ "'을 해석하는 방법도 없습니다. 어떤 vars는 실제로 "sample_1_2000"등으로 이름 지어 졌기 때문에 묻습니다. – Fred

+0

아마도 이것은 "sample_1_2000"이라는 연도 데이터와 함께 더 직관적 일 것입니다. 'temp1 <- transform (temp, time = str_sub (variable, -4), 변수 이름 = str_sub (변수, 1, str_length (변수) -5))' – Fred

+0

@Fred 변수 이름의 형식에 따라 다릅니다. 캐릭터의 (적어도 일부분의) 길이가 고정되면, 당신의 방법이 더 쉽습니다. 그렇지 않으면 정규 표현식이보다 유연 해집니다. – kohske

관련 문제