2015-02-03 3 views
1

데이터 프레임에서 변수의 고유 값을 반환하는 다음과 같은 간단한 코드가 작동하지 않는 이유는 무엇입니까?고유 한 값을 계산하는 함수가 작동하지 않습니다.

uu<-function(datum,group){ 
     k=unique(datum$group) 
    return(k) 
    } 

matcars<-mtcars 
mm<-uu(matcars,gear) 

불행히도 mm은 NULL 값만 반환합니다. 어떠한 제안?


library(dplyr) 
## 
uu <- function(datum, group) { 
    group1 <- substitute(group) 
    GR <- toString(group1) 
    k <- unique(datum[,GR]) 
    test <- filter(datum,group==k[1]) 
    return(test) 
} 
## 
uu(mtcars, gear) 
+3

'$ '를'['k = unique (datum [, group])'으로 대체하십시오. 'uu (matcars, "gear")' – akrun

+0

@akrun에게 감사드립니다. 이 간단한 코드는 완벽하게 작동합니다. –

답변

1

어떤 이유로 사용을 고집하는 경우이 아마 원하는 결과를 달성하는 단순하고 최소한 오류가 발생하기 쉬운 방법이지만, 나는이 @akrun 및 @CathG에 의해 제안 된 접근 방법을 사용하는 것이 좋습니다 함수의 $ 운영자가 여기에 그것을 할 한 가지 가능한 방법입니다

uu <- function(datum, group) { 
    group <- substitute(group) 
    datum <- substitute(datum) 
    unique(eval(call("$",datum,group))) 
} 
## 
R> uu(mtcars,gear) 
[1] 4 3 5 
R> all.equal(unique(mtcars$gear),uu(mtcars,gear)) 
[1] TRUE 
## 
R> uu(mtcars,disp) 
[1] 160.0 108.0 258.0 360.0 225.0 146.7 140.8 167.6 275.8 472.0 460.0 440.0 78.7 75.7 71.1 120.1 318.0 304.0 350.0 400.0 79.0 
[22] 120.3 95.1 351.0 145.0 301.0 121.0 
R> all.equal(unique(mtcars$disp),uu(mtcars,disp)) 
[1] TRUE 

덕분에 @akrun하기 위해, 여기에를 사용하는 또 다른 방법입니다210 연산자 :

uu <- function(datum, group){ 
    args <- as.list(match.call()) 
    e1 <- eval(args$group, datum) 
    unique(e1) 
} 
## 
R> uu(mtcars, gear) 
[1] 4 3 5 
+0

데이터를 테스트하지 않고도 말하기는 어렵습니다. 위 코드와 샘플 데이터 세트를 질문에 추가하십시오. – nrussell

+0

지난번 실수로 @akrun을 삭제 한 것 같습니다. 내 제한된 Stackoverflow 지식 사과. 고맙습니다. @nrussell. 나는 더 어려워. 이제 함수에서 필터링 (dplyr 패키지)이 작동하지 않는 이유가 궁금합니다. 라이브러리 (dplyr) uu

관련 문제