2013-07-17 2 views
1

데이터 프레임에 적용될 변환을 계산하고 다른 몇 가지 조건을 기반으로 값 (또는 NA)을 반환하는 재사용 가능한 함수를 만들려고합니다. 변수. 이것은 함수에서 다중 조건부 계산을 만드는 첫 번째 시도입니다.데이터 프레임에 적용되는 함수로 변수 계산 R

먼저 유형별 var 인 parentID라는 var를 살펴볼 것입니다. 값 377 만 다르게 계산됩니다. 두 개의 vars 리드와 클릭의 값을보고 값이 1보다 큰지 확인합니다. 그렇지 않으면 NA를 반환합니다. 그런 다음 리드 또는 판매가 더 큰지를 결정하고 더 큰 것을 기반으로 계산을합니다.

계산은 간단하다 :

apply(df, 1, set_cr) 

: X의 $ 판매/X $ 클릭 또는 X의 $ 리드/X는 $는

set_cr <- function(x) { 
    if (x$parentID==377) { 
    if (x$leads < 1 | x$clicks < 1) { 
     return(NA) 
    } 
    else { 
     if (x$leads > x$sales) { 
     cr <- x$leads/x$clicks 
     return(cr) 
     } 
     else { 
     cr <- x$sales/x$clicks 
     return(cr) 
     } 
    } 
    } 
    else { 
    if (x$parentID != 377) { 
     if (x$sales < 1 | x$clicks < 1) { 
     return(NA) 
     } 
     else { 
     cr <- x$sales/x$clicks 
     return(cr) 
     } 
    } 
    } 

    return(NA) 
} 

은 그때 사용하여 데이터 프레임이 적용하고 클릭 콘솔에 인쇄 된 값을 보려고했지만 많은 오류가 발생하고 여러 리소스를 검색하고 검사 한 후에 디버깅 할 수 없었습니다. 여기에서 데이터 프레임에 x $ cr var를 만드는 데이 방법을 사용했습니다. 이 질문에 대해 설정

샘플 데이터 :

structure(list(parentID = c(377, 377, 311, 322, 333), clicks = c(9078, 
78404, 398443, 16142, 111715), sales = c(69, 95, 7191, 146, 33966 
), leads = c(500, 0, 500, 0, 33966)), .Names = c("parentID", "clicks", 
"sales", "leads"), row.names = c(NA, 5L), class = "data.frame") 

parentID clicks sales leads 
    377 9078 69 500 
    377 78404 95  0 
    311 398443 7191 500 
    322 16142 146  0 
    333 111715 33966 33966 

알려 나는이를 편집 할 수 있습니다 주시기 바랍니다이 데이터 예제를 공유 할 수있는 더 좋은 방법이 있다면. 패키지를 리콜했지만 rseek 또는 재사용 가능한 데이터 세트에 대해 냉소적으로 찾을 수 없습니다.

미리 감사드립니다.

+0

재현 가능한 예를 들면'head (dput (youredataframe), n = 10)' –

+0

@SanderVanderZeeuw Dput 주셔서 감사합니다. 나는 그것이 d로 시작했지만 그것을 기억할 수 없다는 것을 알았다. – dotcomken

답변

2

apply은 데이터 프레임에서 사용될 때이를 매트릭스로 변환합니다. 데이터 프레임에 문자 또는 요소 변수가 들어 있으면 문자 행렬이되고 코드가 실패합니다.

그러나이 경우 apply이 필요하지 않습니다. 당신은 중첩 된 ifelse들과 코드를 벡터화 할 수 있습니다

set_cr <- function(x) 
{ 
    ifelse(x$parentID == 377, 
    ifelse(x$leads < 1 || x$clicks < 1, NA, x$leads/x$clicks), 
    ifelse(x$sales < 1 || x$clicks < 1, NA, x$sales/x$clicks)) 
} 

set_cr(df) 

(나는 두 번째 else 코드 블록에 오타가 가정합니다.)

+0

감사합니다. 처음에는 ifelse를 사용하려고 생각했습니다. 나는 조건문의 여러 레이어를 추가하기 시작하고 나중에 그 레이어를 확장해야 할 필요가 있다고 생각했다. 내가 만든 큰 오타는 || OR에 대해서. 나는 단지 두 가지 값 중 큰 값을 확인하기 위해 여분의 ifelse를 추가해야했습니다. – dotcomken

+0

1 백만 개 이상의 행에 대한 데이터 확장 방법을 알고 계십니까? 내 접근 방식이 data.table 및 함수에 더 적합할까요? 내 목표는 이것을 대규모 데이터 세트로 확장 할 수 있도록하는 것이 었습니다. – dotcomken

0

작동합니다

x['var'] instead of x$var 

함수를 사용해보십시오. .

set_cr <- function(x) { 
    if (x['parentID']==377) { 
if (x['leads'] < 1 || x['clicks'] < 1) { 
    return(NA) 
} 
else { 
    if (x['leads'] > x['sales']) { 
    cr <- x['leads']/x['clicks'] 
    return(cr) 
    } 
    else { 
    cr <- x['sales']/x['clicks'] 
    return(cr) 
    } 
} 
} 
else { 
if (x['parentID'] != 377) { 
    if (x['sales'] < 1 || x['clicks'] < 1) { 
    return(NA) 
    } 
    else { 
    cr <- x['sales']/x['clicks'] 
    return(cr) 
    } 
} 
} 
return(NA) 
} 
관련 문제