2016-07-07 3 views
1

필자는 비교하려고하는 여러 NP/개인의 데이터를 genotyping했습니다. 아래 데이터 구조에서 알 수 있듯이 e[1,2]e[2,3]에는 NA가 있습니다. 이제 d[1,2] (1)과 d[2,3] (1)을 NA 값으로 바꾸고 싶습니다.다른 데이터 테이블의 NA를 기반으로 한 데이터 테이블의 값을 바꿉니다.

d <- structure(list(`100099681` = c(0L, 2L, 0L), `101666591` = c(1L, 1L, 0L), `102247652` = c(1L, 1L, 1L), `102284616` = c(0L, 1L, 0L), `103582612` = c(0L, 1L, 1L), `104344528` = c(2L, 1L, 0L),  `105729734` = c(1L, 0L, 1L), `109897137` = c(0L, 0L, 2L),  `112768301` = c(0L, 1L, 1L), `114724443` = c(1L, 1L, 1L),  `114826164` = c(1L, 0L, 1L), `115358770` = c(0L, 2L, 0L),  `115399788` = c(1L, 1L, 0L), `118669033` = c(0L, 1L, 1L),  `118875482` = c(2L, 1L, 0L), `119366362` = c(0L, 2L, 0L),  `119627971` = c(0L, 1L, 1L), `120295351` = c(0L, 2L, 0L),  `120998030` = c(0L, 0L, 2L)), .Names = c("100099681", "101666591", "102247652", "102284616", "103582612", "104344528", "105729734", "109897137", "112768301", "114724443", "114826164", "115358770", "115399788", "118669033", "118875482", "119366362", "119627971", "120295351", "120998030"), row.names = c("7:100038150_C", "7:100079759_T", "7:100256942_A"), class = "data.frame") 
> d 
#    100099681 101666591 102247652 102284616 103582612 104344528 105729734 109897137 112768301 114724443 114826164 115358770 115399788 118669033 118875482 119366362 119627971 120295351 120998030 
#7:100038150_C   0   1   1   0   0   2   1   0   0   1   1   0   1   0   2   0   0   0  0 
#7:100079759_T   2   1   1   1   1   1   0   0   1   1   0   2   1   1   1   2   1   2  0 
#7:100256942_A   0   0   1   0   1   0   1   2   1   1   1   0   0   1   0   0   1   0  2 

e<- structure(list(`100099681` = c(1L, 1L, 0L), `101666591` = c(NA, 1L, 1L), `102247652` = c(0L, NA, 0L), `102284616` = c(1L, 1L, 0L), `103582612` = c(1L, 0L, 1L), `104344528` = c(1L, 0L, 1L),  `105729734` = c(0L, 0L, 1L), `109897137` = c(1L, 1L, 0L),  `112768301` = c(0L, 1L, 1L), `114724443` = c(0L, 2L, 0L),  `114826164` = c(0L, 0L, 2L), `115358770` = c(0L, 0L, 2L),  `115399788` = c(0L, 2L, 0L), `118669033` = c(0L, 0L, 2L),  `118875482` = c(0L, 1L, 1L), `119366362` = c(2L, 1L, 0L),  `119627971` = c(0L, 1L, 1L), `120295351` = c(0L, 2L, 0L),  `120998030` = c(0L, 2L, 1L)), .Names = c("100099681", "101666591", "102247652", "102284616", "103582612", "104344528", "105729734", "109897137", "112768301", "114724443", "114826164", "115358770", "115399788", "118669033", "118875482", "119366362", "119627971", "120295351", "120998030"), row.names = c("7:100038150_C", "7:100079759_T", "7:100256942_A"), class = "data.frame") 
> e 
#    100099681 101666591 102247652 102284616 103582612 104344528 105729734 109897137 112768301 114724443 114826164 115358770 115399788 118669033 118875482 119366362 119627971 120295351 120998030 
#7:100038150_C   1  NA   0   1   1   1   0   1   0   0   0   0   0   0   0   2   0   0   0 
#7:100079759_T   1   1  NA   1   0   0   0   1   1   2   0   0   2   0   1   1   1   2   2 
#7:100256942_A   0   1   0   0   1   1   1   0   1   0   2   2   0   2   1   0   1   0   1 

따라서 내 예상 출력은 내가 여기까지 왔

> expected_d 
#    100099681 101666591 102247652 102284616 103582612 104344528 105729734 109897137 112768301 114724443 114826164 115358770 115399788 118669033 118875482 119366362 119627971 120295351 120998030 
#7:100038150_C   0   NA   1   0   0   2   1   0   0   1   1   0   1   0   2   0   0   0  0 
#7:100079759_T   2   1   NA   1   1   1   0   0   1   1   0   2   1   1   1   2   1   2  0 
#7:100256942_A   0   0   1   0   1   0   1   2   1   1   1   0   0   1   0   0   1   0  2 

것;

g <- which(is.na(e), arr.ind=TRUE) 
> g 
#    row col 
#7:100038150_C 1 2 
#7:100079759_T 2 3 

는 다음 (그 문제에 대한 노나 또는) "TEST"에 의해 위치를 대체하기 위해 apply 기능을 사용하려고

apply(g, 1, function(x){ 
    e[x[1], x[2]] <- "TEST" } 
) 
#> apply(g, 1, function(x){ e[x[1], x[2]] <- "TEST" }) 
#7:100038150_C 7:100079759_T 
#  "TEST"  "TEST"  
나는 몇 백만 행/열을 통해 코드의이 비트를 실행합니다

그래서 속도가 문제가 될 것입니다. , 우리는 메모리가 문제가

d[] <- Map(function(x,y) NA^(is.na(y))* x, d, e) 

답변

2

당신의 접근 방식을 기반으로하는 또 다른 방법 인 경우

NA^(is.na(e))*d 

일을 시도 할 수 있습니다

4

: 사전에

d[which(is.na(e), arr.ind = T)] <- NA 
+3

와우 감사합니다. 영리합니다. –

+0

스티븐 (Steven)과 동의하고 0/1/2의 데이터 세트에서 매력처럼 작동하지만 문자가 포함 된 열에서는 작동하지 않습니다 :'NA^(오류) : is.na (adf)) * tdf : 이진 연산자 실행이 중지되었습니다. – Bas

+1

@Bas 예제에 숫자가 아닌 열이 표시되지 않았습니다. – akrun

관련 문제