2017-04-23 6 views
0

다음 I는 구조화 된 데이터를 가지고특정 열의 값에 따라 데이터를 누락 교체

X_PersonA X_PersonB Y_PersonA Y_PersonB 
0   0   5   7 
0   5   3   0 
5   7   8   0 
0   0   1   2 
0   3   1   0 
9   0   0   0 
8   3   4   6 

제가 함께 작업하는 두 가지 사람 X 및 Y와 같은 부정 변수로 데이터 프레임을 가지고있다. X_PersonA = 0 AND X_PersonB = 0 -> both 0 = NA X_Person A = 0 AND X_Person B ≠ 0 -> 0 stays 0 X_Person A ≠ 0 AND X_Person B = 0 -> 0 stays 0

는 관련 칼럼도 0이 포함 된 경우 0 만의 NA로 계산, 더 정확하게는 내가 작동하도록 코드가 필요합니다 : 지금 다음과 같은 논리로 제로의 일부를 교체해야 각각 식별 할 수 있고 동일한 패턴을 따르는 불명확 한 양의 기둥이 있습니다.

의견과 제안에 감사드립니다! 대단히 감사합니다!

+0

'df [(df $ X_PersonA == 0 & df $ X_PersonB == 0), 1 : 2] = NA' 이걸 찾으십니까? –

+0

'Y' 변수는 어떻게됩니까? – akrun

+0

이 함수를 데이터에 적용하면 다음 오류가 발생합니다.'[<-. data.frame' ('* tmp *', df $ x_PersonA == 0 & df $ x_PersonB == : 누락 값은 데이터 프레임의 하위 할당에서 허용되지 않습니다. –

답변

0

난 단지 변수 쌍으로 작동하는 솔루션을 가지고 있지만, 어쩌면 당신은이 코드를 조정할 수 있습니다

library(tidyr) 
library(dplyr) 
dat <- read.table(header=TRUE, text = "X_PersonA X_PersonB Y_PersonA Y_PersonB 
0   0   5   7 
0   5   3   0 
5   7   8   0 
0   0   1   2 
0   3   1   0 
9   0   0   0 
8   3   4   6") 

dat %>% 
     mutate(id = row_number()) %>% 
     gather(key, value, -id) %>% 
     separate(key, c("prefix", "person"), sep = "_") %>% 
     spread(person, value) %>% 
     arrange(id, prefix) %>% 
     mutate_each(funs(ifelse(PersonA == 0 & PersonB == 0, NA, .)), -id, -prefix) %>% 
     gather(key, value, -id, -prefix) %>% 
     mutate(origcol = sprintf("%s_%s", prefix, key)) %>% 
     select(id, origcol, value) %>% 
     spread(origcol, value) %>% 
     select(-id) 

마지막 5 줄 그냥 (약간 어색한) 형식으로 당신에게 다시 dplyr 테이블을 backtransform을 보여 줬어.

결과 : 각각의 새로운 쌍 X_PersonC를 들어

X_PersonA X_PersonB Y_PersonA Y_PersonB 
1  NA  NA   5   7 
2   0   5   3   0 
3   5   7   8   0 
4  NA  NA   1   2 
5   0   3   1   0 
6   9   0  NA  NA 
7   8   3   4   6 

- Y_PersonD 당신이 (검증되지 않은) 새로운 mutate_each() 라인을 추가 할 수 있습니다. 몇 쌍이 있니?

xterminary X_PersonA - Y_PersonB - Z_Person_C 비교 또는 더 복잡한 검사를 수행해야하는 경우 자신의 솔루션에서 찾으십시오.

+0

아니요, 항상 X_A 대 X_B 검사입니다 - 세 번째 예외는 아닙니다. 코드에 감사 드리며 가능한 한 빨리 시도합니다. (결과는 다음과 같습니다.) 결과는 다음과 같습니다. 나는 그것을 원한다. 그것은 완벽하다. –

관련 문제