2014-07-09 4 views
2

도와주세요! 행렬의 해체/행렬의 재정렬

는 I 큰 매트릭스를 가지고 있고 데이터를 재 배열하고 싶은 (또는 난 martix의 해체를 호출한다?)

M1 M2 M3 M4 
L1 "AA" "--" "GG" "CC" 
L2 "AG" "CC" "--" "AA" 
L3 "GG" "CG" "TT" "TT" 
L4 "--" "GG" "CC" "TT" 
L5 "AA" "--" "AA" "CC" 
L6 "AT" "CC" "CT" "AA" 
L7 "TT" "CG" "TA" "CC" 

샘플 데이터는 I 재정렬해야

test <- matrix(c("AA", "AG", "GG", "--","AA", "AT", "TT", "--","CC", "CG", "GG", "--","CC", "CG", "GG", "--","TT","CC","AA","CT","TA","CC","AA","TT","TT","CC","AA","CC"),nrow=7) 
row.names(test)= c("L1", "L2", "L3", "L4", "L5", "L6", "L7") 
colnames(test)= c("M1", "M2", "M3", "M4") 

인 다음 형식으로 데이터를 가져옵니다.

Line Marker testx 
L1  M1 AA 
L1  M2 -- 
L1  M3 GG 
L1  M4 CC 
L2  M1 AG 
L2  M2 CC 
L2  M3 -- 
L2  M4 AA 
L3  M1 GG 
L3  M2 CG 
L3  M3 TT 
L3  M4 TT 
. 
. 
. 

긴 솔루션이 있지만 (아래 참조) 큰 데이터 세트를 처리하는 것은 어렵습니다. 제발 도와주세요! 내가 생각할 수있는

testx<-c(test) 
testx1<-data.frame(testx) 
testx2<-cbind(Line = c("L1","L2","L3","L4","L5","L6","L7"), testx1) 
testx3<-testx2[order(testx2$Line),] 
testx4<-cbind(Marker = c("M1","M2","M3","M4"), testx3) 
testx5 <- testx4[,c("Line", "Marker", "testx")] 
+0

이러한 경우의 일반적인 접근 방식은'as.data.frame (as.table (test))'입니다. 값이있는 열이 "숫자"일 때 정확한 반대 인 'xtabs'도 매우 유용합니다. –

답변

2

가장 쉬운 방법은 "reshape2"에서 melt을 사용하는 것입니다 : 거기에서

library(reshape2) 
melt(test) 
# Var1 Var2 value 
# 1 L1 M1 AA 
# 2 L2 M1 AG 
# 3 L3 M1 GG 
# 4 L4 M1 -- 
# 5 L5 M1 AA 
## <<SNIP>> 
# 23 L2 M4 AA 
# 24 L3 M4 TT 
# 25 L4 M4 TT 
# 26 L5 M4 CC 
# 27 L6 M4 AA 
# 28 L7 M4 CC 

, 그냥 "VAR1"와 "변수 2를 대입 할 때 변수"에 필요한 순서를 얻을 order를 사용 .

1
data.frame(Line=rep(row.names(test), each=ncol(test)), Marker=rep(colnames(test), times = nrow(test)), testx=c(t(test))) 
0

당신이 먼저 data.frame에 매트릭스를 변환하는 경우는, reshape2보다는 패키지를 tidyr 사용할 수 있습니다.

library(tidyr) 
    library(dplyr) ## for arrange() 

    test1 <- data.frame(Line = rownames(test),test) 

    test2 <- gather(test1,Marker,testx,M1:M4) 

    head(arrange(test2,Line,Marker)) 

    Line Marker testx 
1 L1  M1 AA 
2 L1  M2 -- 
3 L1  M3 GG 
4 L1  M4 CC 
5 L2  M1 AG 
6 L2  M2 CC 

마지막 단계 인 arrange은 단순히 예제와 같이 데이터를 정렬하는 것입니다. @Ananda가 지적했듯이 order으로 쉽게 할 수 있습니다.