2015-01-14 6 views
4

함수 내에서 dplyr을 사용하려고합니다. 열 이름을 변수로 전달하여 summarize 함수에서 n_distinct와 함께 사용합니다.dplyr n_distinct를 따옴표 붙은 변수와 함께 사용하기

비 네트 (nse)에 설명 된대로 summarize_, arrange_ etc 함수를 사용하면 dplyr을 사용한 프로그래밍이 더욱 쉬워졌습니다. 나는 lazyeval 에서뿐만 아니라 interp의 다양한 조합을 시도했습니다. "n_distinct()에 대한 입력은 데이터 세트의 단일 변수 이름이어야합니다"(이는 의미가 있습니다. 문자열에 변수 이름이 있다는 것입니다 ...)

이것은 함수 외부에서 올바르게 작동합니다 (언급 열 이름이 data.frame에) :

summarize(data, count=n_distinct(mention)) 

이것은 내 첫 번째 노력이었다
getProportions <- function(datain, id_column) { 
    overall_total <- summarize(datain, count=n_distinct(id_column))[1,1] 
} 

getProportions(measures, "mention") 

그리고 시도 dplyr과 프로그래밍에 대해 여기에 NSE 문서 및 일부 스레드를 읽은 후

:

overall_total <- summarize_(datain, count=interp(~n_distinct(var),var=as.name(id_column)))[1,1] 

그러나 아무 소용이 없습니다. 어떤 아이디어? 거의 n_distinct_()가 필요한 것처럼 보입니까?

편집 사과와 감사합니다. 당신 말이 맞아요, 인터프리터 버전이 작동합니다, 나는 결코 그 완전한 조합을 치지 않았을 것 같습니다. 이전 버전을 살펴 봤는데 바로 var 부분을 가지고있을 때는 plain()을 사용했고 summarize_()를 사용했을 때는 var 호출 부분을 생략했습니다. 한숨. 두 버전 모두에서 완전한 예제를 작성하지 않은 것에 대한 제 잘못입니다. 코멘트에 나타난 바와 같이

+0

이 문제는 저에게 잘 맞지 않습니다 :'f <- function (data, col) summarise_ (data, count = interp (~ n_distinct (var), var = as.name (col))) '그리고 나서 'f (mtcars, "cyl")'는 올바른 출력을 반환합니다. 정확히 작동하지 않는 것을 명확히 할 수 있습니까? –

+0

다시 한 번 감사드립니다 (답변을 편집했습니다). 이것은 질문이 아니 었습니다. 삭제해야합니까? – jameshowison

+1

나중에 그것을 유용하게 사용할 수 있기 때문에 삭제하거나 답변을 수락 할 수 있습니다. –

답변

2

이 분명히 내가 아주 (내가 = var에 왼쪽했던 보정시 호출의 일부입니다.) 테스트 적이없는 내 두 번째 옵션이었다 할 수있는 올바른 방법 :

f <- function(data, col) { 
     summarise_(data, count = interp(~n_distinct(var), var = as.name(col))) 
} 
f(mtcars, "cyl") 
+0

이 기능을 사용하려면 interp 함수의 네임 스페이스를 정규화해야합니다. 즉, lazyeval :: interp – mthornal

+0

실제로 나를 위해 일했습니다. 그러나 어떤 dplyr 계산에서'length (unique (col)) '가'n_distinct (col)'보다 빠르다는 것을 알았습니다. 이유는 모르겠다. –

관련 문제