2017-11-06 2 views
1

조건이 충족되면 값을 다른 것으로 대체하는 문제가 있습니다. 나는 자신의 기능을 사용하여 data_manip을 할당하거나 필요할 때 다른 조건을 추가 할 수 있습니다.그룹화 된 데이터에서 값을 사용자 정의 함수로 바꾸기

그러나이 data_manip 기능을 사용하려고하면 할당 된 값으로 해당 그룹 내의 모든 값이 변경됩니다. 그러나이 특정 집단의 다른 가치들은이 조건을 충족시키지 못합니다. 여기

df <- data.frame(percent = c(0.6, 0.7,1, 0.5,0.5,1,0.4,0.6,1), 
       type = rep(c("good", "bad","ugly"),each=3), smoke=rep(c('Visky','Wine','Wine'),3), 
       sex=rep(c('male','male','female'),3)) 

> df 
    percent type smoke sex 
1  0.6 good Visky male 
2  0.7 good Wine male 
3  1.0 good Wine female 
4  0.5 bad Visky male 
5  0.5 bad Wine male 
6  1.0 bad Wine female 
7  0.4 ugly Visky male 
8  0.6 ugly Wine male 
9  1.0 ugly Wine female 


data_manip <- function(x,gr){ 
    if(grepl('goo|ug',gr)&&x<1){ 
    x[x==0.6] <- 1 
    } 
    else 
    x 
} 

df%>% 
    group_by(type)%>% 
    mutate(percent_new=data_manip(percent,type)) 

# A tibble: 9 x 5 
# Groups: type [3] 
    percent type smoke sex percent_new 
    <dbl> <fctr> <fctr> <fctr>  <dbl> 
1  0.6 good Visky male   1.0 
2  0.7 good Wine male   1.0 
3  1.0 good Wine female   1.0 
4  0.5 bad Visky male   0.5 
5  0.5 bad Wine male   0.5 
6  1.0 bad Wine female   1.0 
7  0.4 ugly Visky male   1.0 
8  0.6 ugly Wine male   1.0 
9  1.0 ugly Wine female   1.0 

나는 조건이 그들을 위해없는 경우 원래 percent 값을 유지하고 싶은를 제공, 내가 노력하는 것이다.

예상 출력

# A tibble: 9 x 5 
    # Groups: type [3] 
     percent type smoke sex percent_new 
     <dbl> <fctr> <fctr> <fctr>  <dbl> 
    1  0.6 good Visky male   1.0 
    2  0.7 good Wine male   0.7 
    3  1.0 good Wine female   1.0 
    4  0.5 bad Visky male   0.5 
    5  0.5 bad Wine male   0.5 
    6  1.0 bad Wine female   1.0 
    7  0.4 ugly Visky male   0.4 
    8  0.6 ugly Wine male   1.0 
    9  1.0 ugly Wine female   1.0 
+0

시도'ifelse는()'에서'돌연변이()','ifelse는()'벡터화 기능입니다. – fhlgood

+0

또는 mutate()에서'sapply()'를 사용하면 vectorized 출력을 반환하는 것이 mutate에서 새로운 값을 대체하거나 생성하는 데 사용될 수 있습니다. – fhlgood

+0

@fhlgood'sapply'와 같은 결과를 얻었습니다; ( – Alexander

답변

2

은 일반적으로 단 하나의 값을 확인하고 아마도 벡터의 첫 번째 요소로 디폴트된다 if (cond) { ... } else { ... }를 사용하기 때문에 현재 data_manip 기능 벡터화 보이지 않는다. 함수의 벡터화 버전은 다음과 같습니다

data_manip <- function(x,gr){ 
    ifelse(grepl('goo|ug', gr) & x == 0.6, 1, x) 
} 

그리고 예상되는 결과를 제공합니다

> df%>% 
+  group_by(type)%>% 
+  mutate(percent_new=data_manip(percent,type)) 
# A tibble: 9 x 5 
# Groups: type [3] 
    percent type smoke sex percent_new 
    <dbl> <fctr> <fctr> <fctr>  <dbl> 
1  0.6 good Visky male   1.0 
2  0.7 good Wine male   0.7 
3  1.0 good Wine female   1.0 
4  0.5 bad Visky male   0.5 
5  0.5 bad Wine male   0.5 
6  1.0 bad Wine female   1.0 
7  0.4 ugly Visky male   0.4 
8  0.6 ugly Wine male   1.0 
9  1.0 ugly Wine female   1.0 

사용 ifelse는 벡터화 된 상태 검사를 얻을 수 있습니다.

+0

정말 해결책과 설명을 고맙게 생각합니다! 고마워요! – Alexander

2

이것은 case_when이 유용 할 것으로 보입니다.

이 시도 :

library(tidyverse) 

df %>% 
    mutate(new_percentage = case_when(type == "good" & percent == 0.6 ~ 1, 
            type == "ugly" & percent == 0.6 ~ 1, 
            TRUE ~ as.double(.$percent))) 

주는 :

# A tibble: 9 x 5 
    percent type smoke sex new_percentage 
    <dbl> <fctr> <fctr> <fctr>   <dbl> 
1  0.6 good Visky male   1.0 
2  0.7 good Wine male   0.7 
3  1.0 good Wine female   1.0 
4  0.5 bad Visky male   0.5 
5  0.5 bad Wine male   0.5 
6  1.0 bad Wine female   1.0 
7  0.4 ugly Visky male   0.4 
8  0.6 ugly Wine male   1.0 
9  1.0 ugly Wine female   1.0