2016-08-19 3 views
1

데이터 프레임에로드 된 460K 관측치가있는 데이터 세트가 data입니다.dplyr mutate 잘못된 결과가있는 함수 호출

$ exeroft1 <int> NA, 105, NA, 205, NA, 102, 220, 102, 102, 220, 230, NA, NA, 105, 102, 210, 203, NA, NA, 107, 103, NA, 203, NA, NA, 105, 107, NA, 102, NA, 107, NA, 107, 103, ... 

제가 다른 값으로 값 변환은 다음 함수에 exeroft1의 각 값을 전달해야 : 변수 중 하나는 다음과 같이 정의된다 여기서

calculateWeeklyExercise <- function(value) { 
    if (value > 200) { 
     timesWeekly = (value - 200)/4 
    } else { 
     timesWeekly = (value - 100) 
    } 

    timesWeekly 
} 

일부 R 부호로서 않는 모든 처리 :

data %>% 
    # Filter missing values 
    filter(!is.na(exeroft1)) %>% 

    # Add a column to the data frame which represents exercise rate 
    mutate(weeklyExercise = calculateWeeklyExercise(exeroft1)) %>% 

    # Select some values 
    select(educa, sex, exeroft1, weeklyExercise) 

이 코드를 실행하면, 내가 이해할 수없는 다음과 같은 경고를 얻을 :

Warning message: 
In if (value > 200) { : 
    the condition has length > 1 and only the first element will be used 

저는 R에 익숙하지 않습니다. 함수에 전달하는 값이 정수로 처리되지 않는 것 같습니다. 모든 값이 < 인 경우 올바른 값이 계산됩니다. 200보다 큰 값은 200이 아닙니다. 따라서 본질적으로 함수에서 else 절만이 실행될 것으로 보인다.

+0

길이가 1 이상일 때'if/else' 문제와 관련이 있습니다'ifelse'를 사용하거나 각 행에 적용 할 경우'data %> % # 필터 누락 값 필터 .na (exeroft1)) %> % rowwise() %> %>'하고해라. – akrun

+0

@akrun - 나는 이해하지 못합니다. 'value'가 정수일 때 길이가 1보다 큰 것으로 취급되는 이유는 무엇입니까? –

+0

(재현 가능한 예제가 없다면) 값이 입력으로 열을 가져오고 열의 길이가 1보다 커야합니다. 즉, if (1 : 3> 2) 1 '은 동일한 경고를받습니다. – akrun

답변

2

ifelse을 사용하는 함수를 수정하면 ie. 여러 값을 취할 수 if/else의 벡터화 된 형태는 다음의 OP의 기능 집합의 컬럼에 적용되는 것과 같은 경고 메시지가 소자의 개수가 1보다 큰 곳 명백

calculateWeeklyExerciseNew <- function(value) { 
    ifelse(value > 200, 
      (value - 200)/4, 
       value - 100) 

} 

작동해야 if/else은 단일 관찰 만 취하므로 경고를 발생시킵니다. 즉

if(1:3 >2) 1 

경고 메시지 : 1 : (2> (3) 1) 경우에 조건을 가지고 길이> 1 오직 첫 번째 요소가 사용되는 상기 예에서,

, 우리는 길이 3 ( 1:3)의 벡터를 가지고 있고, 우리가 그러나 ifelse

ifelse(1:3 >2, 1, 0) 
#[1] 0 0 1 

로 할 경우 가정, 경고를 제공, 우리는 여전히 사용할 수 있습니다 영업 이익의 기능은 rowwise

data %>% 
    filter(!is.na(exeroft1)) %>% 
    rowwise() %>% 
    mutate(weeklyExercise = calculateWeeklyExercise(exeroft1)) %>% 
    select(educa, sex, exeroft1, weeklyExercise) 

을 수행하여 단 하나의 관찰을 할 수 있지만, 그 속도가 느려질 수있다.

+1

고맙습니다. 좋은 설명. –

+0

그냥 참고로, 나는 ifelse를 시도하고 나는 여전히 경고와 잘못된 결과를 얻고있다. –

+0

@RandyMinder 테스트 할 재현 가능한 예제를 제공하지 않았습니다. 제 제안은 당신이 보여준 경고에 근거한 것입니다. – akrun

관련 문제