2017-05-23 2 views
1

나는 Bayenv에서 공분산 행렬을 생성하기 위해 사용했던 SNPS 파일을 가지고 있으므로이 파일의 각 열은 모집단과 행이 SNP이지만 각 SNP에 대해 두 개의 대립 형에 대해 두 행이 있습니다. (2 * nsnps "행"및 npops "열") 다음과 같이 :행을 짝수 행으로 바꾸기

7  2  2  0  6  2  2 
1  0  0  0  0  0  0 
0  2  2  0  0  0  0 
1  0  0  0  0  0  0 

을 그래서이 예제에서 나는 7 명 인구 (열) 및 2 개의 SNP (행)가 위. 이 파일의 형식을 약간 수정해야합니다. 새 파일에서 각 행은 하나의 SNP와 일치해야하며 각 숫자 쌍이 각 대립 유전자에 해당하기 때문에 열의 수는 모집단 수의 두 배가되어야합니다.

7 1 2 0 2 0 0 0 6 0 2 0 2 0 
0 1 2 0 2 0 0 0 0 0 0 0 0 0 

내가 R이 조작을 할 수있는 방법이 : 그래서 새 파일은 다음과 같이 (nsnps "행"2 * npops "열")을 찾아야한다? 나는 어떤 제안을 주셔서 감사합니다.

+0

는 데이터 프레임인가요? – Sotos

+0

예, 데이터 프레임입니다 – Anna1364

답변

1

사용 :

x <- split(mydf, rep(1:(nrow(mydf)/2),each=2)) 

t(sapply(x, function(x) matrix(as.matrix(x)))) 

을 제공합니다

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
1 7 1 2 0 2 0 0 0 6  0  2  0  2  0 
2 0 1 2 0 2 0 0 0 0  0  0  0  0  0 

또한 수행 할 수 있습니다

x <- split(mydf, rep(1:(nrow(mydf)/2),each=2)) 
newdf <- do.call(rbind.data.frame, lapply(x, function(x) matrix(as.matrix(x), nrow = 1))) 

을하고 다시 dataframe를 얻을 :

,536을
> newdf 
    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 
1 7 1 2 0 2 0 0 0 6 0 2 0 2 0 
2 0 1 2 0 2 0 0 0 0 0 0 0 0 0 
> class(newdf) 
[1] "data.frame" 

사용되는 데이터 :

mydf <- structure(list(V1 = c(7L, 1L, 0L, 1L), V2 = c(2L, 0L, 2L, 0L), V3 = c(2L, 0L, 2L, 0L), V4 = c(0L, 0L, 0L, 0L), V5 = c(6L, 0L, 0L, 0L), V6 = c(2L, 0L, 0L, 0L), V7 = c(2L, 0L, 0L, 0L)), 
        .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7"), class = "data.frame", row.names = c(NA, -4L)) 
+0

Jaap에게 많은 감사드립니다. 내가 원하는 것입니다. 완벽하게 작동합니다. – Anna1364

1

기본적으로 데이터의 하위 집합을 지정하고 짝수 행만 가져 오는 경우 다음을 수행 할 수 있습니다. 데이터가 행렬 m에 저장된다고 가정합니다. 여기서는 seq() 함수를 사용하여 행렬 인덱스를 나타내는 행 인덱스를 나타내는 숫자 시퀀스를 생성하여 행을 선택합니다. 이것은 data.frames에서도 작동합니다.

> m <- matrix(c(1:33), nrow = 11, ncol = 3, byrow = TRUE) 
> m 
     [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 
[4,] 10 11 12 
[5,] 13 14 15 
[6,] 16 17 18 
[7,] 19 20 21 
[8,] 22 23 24 
[9,] 25 26 27 
[10,] 28 29 30 
[11,] 31 32 33 
> m[seq(from=2, to=nrow(m), by=2),] 
    [,1] [,2] [,3] 
[1,] 4 5 6 
[2,] 10 11 12 
[3,] 16 17 18 
[4,] 22 23 24 
[5,] 28 29 30