2014-09-06 4 views
1

다음 형식으로 데이터를 다시 형상화 할 수 있습니까?R의 데이터 프레임에서 데이터 재구성

Date  Student Test.1 Test.2 Test.3 
    2007/02/01 A  80  90  70 
    2007/02/01 B  90  60  90 
    2007/02/01 C  75  70  80 
    2007/02/01 D  50  80  70 

다음 형식으로? 이 같은

Date  Student Result Test 
    2007/02/01 A  80  1 
    2007/02/01 A  90  2 
    2007/02/01 A  70  3 
    2007/02/01 B  90  1 
    2007/02/01 B  60  2 
    2007/02/01 B  90  3 
    2007/02/01 C  75  1 
    2007/02/01 C  70  2 
    2007/02/01 C  80  3 
    2007/02/01 D  50  1 
    2007/02/01 D  80  2 
    2007/02/01 D  70  3  

답변

0

melt() 기능이 유용 할 수 있습니다

 Date Student variable value 
2007/02/01  A Test.1 80 
2007/02/01  B Test.1 90 
2007/02/01  C Test.1 75 
2007/02/01  D Test.1 50 
2007/02/01  A Test.1 90 
... 

그런 다음 열 이름을 변경 및/또는 값을 수정할 수 있습니다 :

library(reshape) 
md <- melt(df, id=c('Date','Student') 

결과 '녹'데이터 프레임이 같은 것 귀하의 필요에 맞게.

그런 다음 축약 된 데이터 프레임을 만들기 위해 녹은 데이터 프레임을 cast() 함수와 함께 사용할 수 있습니다. the Quick-R tutorial: Reshaping data을 확인하십시오.

0

뭔가 할 것입니다 :

reshape(x, direction='long', varying=paste('Test', 1:3, sep='.')) 
      Date Student time Test id 
1.1 2007/02/01  A 1 80 1 
2.1 2007/02/01  B 1 90 2 
3.1 2007/02/01  C 1 75 3 
4.1 2007/02/01  D 1 50 4 
1.2 2007/02/01  A 2 90 1 
2.2 2007/02/01  B 2 60 2 
3.2 2007/02/01  C 2 70 3 
4.2 2007/02/01  D 2 80 4 
1.3 2007/02/01  A 3 70 1 
2.3 2007/02/01  B 3 90 2 
3.3 2007/02/01  C 3 80 3 
4.3 2007/02/01  D 3 70 4 

그런 다음 필요에 따라 열 이름을 바꿀 수 있습니다. 여기서 time 열은 원하는 출력에 Test으로 레이블 된 것입니다. 이것은 와이드 형식의 열이 긴 형식으로 구별되는 방법입니다.

0

는 함께 다음과 같이 사용할 수있다 "dplyr"+ "tidyr"에서 볼 수, 일반적인 접근의 검거를 완료하려면 :

library(dplyr) 
library(tidyr) 

mydf %>% gather(Time, Score, starts_with("Test")) 
#   Date Student Time Score 
# 1 2007/02/01  A Test.1 80 
# 2 2007/02/01  B Test.1 90 
# 3 2007/02/01  C Test.1 75 
# 4 2007/02/01  D Test.1 50 
# 5 2007/02/01  A Test.2 90 
# 6 2007/02/01  B Test.2 60 
# 7 2007/02/01  C Test.2 70 
# 8 2007/02/01  D Test.2 80 
# 9 2007/02/01  A Test.3 70 
# 10 2007/02/01  B Test.3 90 
# 11 2007/02/01  C Test.3 80 
# 12 2007/02/01  D Test.3 70 

당신이 찾고있는 특정 양식을 얻으려면, separateselect과 함께 더 나아갈 수 있습니다.

mydf %>% 
    gather(Time, Score, starts_with("Test")) %>% 
    separate(Time, c("Stub", "Test")) %>% 
    select(-Stub) 
#   Date Student Test Score 
# 1 2007/02/01  A 1 80 
# 2 2007/02/01  B 1 90 
# 3 2007/02/01  C 1 75 
# 4 2007/02/01  D 1 50 
# 5 2007/02/01  A 2 90 
# 6 2007/02/01  B 2 60 
# 7 2007/02/01  C 2 70 
# 8 2007/02/01  D 2 80 
# 9 2007/02/01  A 3 70 
# 10 2007/02/01  B 3 90 
# 11 2007/02/01  C 3 80 
# 12 2007/02/01  D 3 70 
관련 문제