2016-07-20 3 views
2

을 사용하여 선택 항목을 추가로 하위 집합으로 만들었습니다. 파이프 연산자가 %>% 인 것으로 확인되어 코드를보다 쉽게 ​​읽을 수 있습니다. 여기 내 MWE입니다.R : 파이프 %> % 및 자리 표시 자

library(dplyr)           # for the pipe operator 
library(lsr)           # for the cohensD function 

set.seed(4)            # make it reproducible 
dat <- data.frame(          # create data frame 
    subj = c(1:6), 
    pre = sample(1:6, replace = TRUE), 
    post = sample(1:6, replace = TRUE) 
) 

dat %>% select(pre, post) %>% sapply(., mean)   # works as expected 

그러나,이 특정한 경우

dat %>% select(pre, post) %>% cohensD(.$pre, .$post) # piping returns an error 
cohensD(dat$pre, dat$post)        # classical way works fine 

$와 조합 . 지정자를 사용하는 열을 서브 세트 불가능에 파이프 연산자를 사용 고투? 파이프 연산자 %>%을 사용하여이 행을 작성하는 것이 좋습니까? 아니면 구문이 복잡합니까? 이것을 쓰는 고전적인 방법은 더 간결 해 보인다.

+0

'%> %'파이프 연산자가 첫 번째 인자로 왼쪽을 파이프하기 때문에 아마 에러가 발생한다. 오른쪽. 그러나'cohensD' 함수는 data.frame을 받아들이는 첫 번째 인수를 갖고 있지 않습니다. IMO 기본 R 구문으로 이것을 작성하는 것이 더 깔끔합니다. –

+1

이렇게하면됩니다 :'dat %> % select (pre, post) %> % {cohensD (. $ pre,. $ post)}'. 마지막 호출은 함수가 아닌 표현식처럼 취급됩니다. 표현식에 무언가를 파이프하면 '.'가 예상대로 바뀝니다. 나는 종종이 트릭을 사용하여 파이핑과 잘 인터페이싱하지 않는 함수를 호출한다. –

답변

3

데이터 묶음에서 하나의 값 행으로 이동하므로 요약하면됩니다. '

dat %>% select(pre, post) %>% summarize(CD = cohensD(pre, post)) 

(SELECT 문의 ISN하십시오 dplyr 파이프 라인에서 당신은 다음의 서브 세트를 할 필요가 없습니다 대한 요약 함수 내에서 대한 요약 기능을 사용할 수 있으며, 너무처럼 prepost

를 호출 할 수 있습니다 이 경우 실제로 필요하다. 그러나 파이프 라인에서 이것이 어떻게 작동하는지 보여주기 위해 왼쪽으로 두었다.)

+2

나는 당신이 명시 적으로'$'로 서브 타입을 가질 필요가 없다고 생각한다; 이것은 충분해야합니다.'dat %> % summarize (CD = cohensD (pre, post))' – Drey

+0

당신은 전적으로 파이프 라인 내부에서 부분 집합을 사용했고, 부분 집합을 만드는 데 집중했습니다. 첫 번째 장소에서 서브 세트하지 않는 것만 생각해보십시오, 감사합니다! –

+0

왜'library (effsize)'패키지의'cohen.d' 함수로 동작하지 않습니까? 'dat %> % summarize (CD = cohen.d (pre, post))'는 에러를 반환합니다. – piptoma

1

. 연산자를 호출 할 때 중첩 함수 (예 : $...)가 아닌 인수로 직접 사용해야하기 때문에 작동하지 않습니다. 당신이 정말로 배관을 사용하려면

, 당신은 공식 인터페이스와 함께 할,하지만 전에 약간의 재편과 (용융 reshape2 패키지입니다) 할 수 있습니다

dat %>% select(pre, post) %>% melt %>% cohensD(value~variable, .) 
#### [1] 0.8115027 
3

이 작동합니다 :

dat %>% select(pre, post) %>% {cohensD(.$pre, .$post)} 

마지막 호출을 중괄호로 감싸는 것은 함수 호출이 아닌 표현식처럼 취급됩니다. 뭔가를 표현식으로 파이프하면,. 예상대로 교체됩니다. 나는 종종이 트릭을 사용하여 파이핑과 잘 인터페이싱하지 않는 함수를 호출한다.

중괄호 안에있는 것은 함수 호출 일 뿐이며 실제로는 .의 표현식이 될 수 있습니다.