2017-10-20 2 views
1

정말 답을 찾기 위해 열심히 노력했고 중복 된 경우 사과합니다.조건부로 열의 값을 다른 열의 값으로 바꾸기 dplyr

나는 내 질문을 설명하기 위해 더미 데이터를 만들 것이다.

tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0)) 

# A tibble: 3 x 3 
     a sample1 sample2 
<dbl> <dbl> <dbl> 
1 0.1  0  1 
2 0.2  1  1 
3 0.3  1  0 

어떻게 조건부 열 에는 sample1 그래서 그들은 하나의 동일한 경우, 그들은 의 값을 취하는 것이 sample2를의 값을 변경합니다.

결과 tibble은 다음과 같아야합니다

# A tibble: 3 x 3 
     a sample1 sample2 
<dbl> <dbl> <dbl> 
1 0.1  0  0.1 
2 0.2  0.2  0.2 
3 0.3  0.3  0 

가 이상적으로 나는 (내가> 100 샘플 열이) 각 샘플 열이 작업을 수행하지 않기 때문에 길을 루프에 열을 통해 것 (비록 루프가 악마라는 것을 알지만) 더 좋을 것.

도움 주셔서 감사합니다.

답변

1

당신은 ifelsemutate_at를 사용할 수 있습니다

df %>% mutate_at(vars(starts_with('sample')), funs(ifelse(. == 1, a, .))) 

# A tibble: 3 x 3 
#  a sample1 sample2 
# <dbl> <dbl> <dbl> 
#1 0.1  0.0  0.1 
#2 0.2  0.2  0.2 
#3 0.3  0.3  0.0 

vars(starts_with('sample')) 일치 samplemutate_at로 시작하는 모든 열 각 열에 기능 funs(ifelse(. == 1, a, .)) 적용을; .은 일치하는 항목을 나타냅니다. which()를 사용

df %>% mutate_at(vars(starts_with('sample')), funs(. * a)) 

# A tibble: 3 x 3 
#  a sample1 sample2 
# <dbl> <dbl> <dbl> 
#1 0.1  0.0  0.1 
#2 0.2  0.2  0.2 
#3 0.3  0.3  0.0 
+0

남자 .. . 나는 mutate_at로 얼마 동안 놀려고했지만, ifelse() 대신 replace()를 사용했다. 이것은 완벽하게 작동했습니다 ... 감사합니다! – Ryan

+0

'replace'도 제 첫 생각이었습니다. 그러나 그것은 조건과 교체가 동일한 길이 또는 재활용이 필요하며, 이는 여기 ifelse만큼 편리하지 않습니다. – Psidom

-1

비 dplyr 솔루션 : 당신은 모든 샘플의 열은 10를 포함 확실한 경우


, 그것은으로 단축 할 수

> t=tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0)) 

> whichRows=which(t$sample1==t$sample2) 

> t[whichRows,c('sample1','sample2')]<-t[whichRows,'a'] 

> t 
# A tibble: 3 x 3 
     a sample1 sample2 
    <dbl> <dbl> <dbl> 
1 0.1  0.0  1.0 
2 0.2  0.2  0.2 
3 0.3  1.0  0.0