요인

2012-12-18 2 views
1

가 나는 요인에 N3에 열과 열 N1에 요소 유형을 변환 할요인

DFtest <- data.frame(Zone=rep(c("R1","R2","R3"),each=2), 
        Type=rep(c("C1","C2"),3), 
        N1=sample(1:6), 
        N2=sample(seq(0,1,length.out=6)), 
        N3=sample(letters[1:6])) 
DFtest 

    Zone Type N1 N2 N3 
1 R1 C1 2 0.4 c 
2 R1 C2 5 1.0 a 
3 R2 C1 4 0.6 e 
4 R2 C2 3 0.2 d 
5 R3 C1 1 0.0 b 
6 R3 C2 6 0.8 f 

이 dataframe을 고려합니다. 원하는 최종 결과는 다음과 같아야합니다

Zone Ns Type.C1 Type.C2 
1 R1 N1  2  5 
2 R1 N2  0.4  1.0 
3 R1 N3  c  a 
4 R2 N1  4  3 
5 R2 N2  0.6  0.2 
6 R2 N3  e  d 
7 R3 N1  1  6 
8 R3 N2  0.0  0.8 
9 R3 N3  b  f 

내가 달성에 노력했습니다 그 dcast, 등등 녹아, 바꿀하지만 올바른 방법을 찾을 수 plyr 결합하여.

+2

'샘플'과 같이 임의의 숫자를 생성하는 것을 사용할 때마다 예제 데이터에서'set.seed()'를 사용하는 것을 고려하십시오. – A5C1D2H2I1M1N2O1R2T1

답변

8

는 여기에 "reshape2"접근 방식 대단히 감사합니다 :

여기
library(reshape2) 
DFtestL <- melt(DFtest, id.vars=1:2) 
dcast(DFtestL, Zone + variable ~ Type) 
# Zone variable C1 C2 
# 1 R1  N1 2 3 
# 2 R1  N2 0.2 0.4 
# 3 R1  N3 c d 
# 4 R2  N1 1 6 
# 5 R2  N2 0 0.8 
# 6 R2  N3 a b 
# 7 R3  N1 5 4 
# 8 R3  N2 0.6 1 
# 9 R3  N3 f e 

reshape()aggregate()를 사용하여 기본 R의 접근 방법이다. 행 순서는 나중에 order()을 사용하여 수정할 수 있습니다.

DFtestL2 <- reshape(DFtest, direction = "long", 
        idvar=c("Zone", "Type"), 
        varying=3:ncol(DFtest), sep="") 
aggregate(N ~ Zone + time, DFtestL2, I) 
# Zone time N.1 N.2 
# 1 R1 1 2 3 
# 2 R2 1 1 6 
# 3 R3 1 5 4 
# 4 R1 2 0.2 0.4 
# 5 R2 2 0 0.8 
# 6 R3 2 0.6 1 
# 7 R1 3 c d 
# 8 R2 3 a b 
# 9 R3 3 f e 
+0

나보다 1 초 빠릅니다. – Roland

관련 문제