2014-10-22 2 views
5

R 패키지 'dplyr'의 mutate 함수는 요소에 대한 고유 한 재활용 기능을 가지고 있는데, 이는 as.numeric 요소를 반환하는 것으로 보입니다. zc(1,1)dplyr :: mutate의 이상한 요소 재활용 - 버그 또는 기능?

library(dplyr) 
df <- data_frame(x=1:2) 
glimpse(df %>% mutate(y="A", z=factor("B"))) 
# Variables: 
# $ x (int) 1, 2 
# $ y (chr) "A", "A" 
# $ z (int) 1, 1 

입니다이 뒤에 어떤 근거가 있는가, 또는 버그 반면 다음 예에서 y, 당신은 무엇을 기대하게?

(나는 R 3.1.1 및 dplyr 0.3.0.1을 사용하고 있습니다.)


는 편집 :

GitHub의에 대한 문제로 게시 한 후, 로맹 프랑소와은 시간 이내에 고정! 따라서 위 경우 문제는 최신 버전을 얻을 수 devtools::install_github를 사용한다 : 다음

library(devtools) 
install_github("hadley/dplyr") 

library(dplyr) 
df <- data_frame(x=1:2) 
glimpse(df %>% mutate(y="A", z=factor("B"))) 
# Variables: 
# $ x (int) 1, 2 
# $ y (chr) "A", "A" 
# $ z (fctr) B, B 

잘 했어 로맹를!

+0

이 동작은 벡터 재활용으로 인한 것 같습니다. 길이가 2 인 요소를 지정하면, 예를 들어'glimpse (df %> % mutate (y = "A", z = factor (c ("B", "C"))))''변수를 지정하면 변수'z' 요소 클래스가 될 것입니다. –

+0

요소 변수를 얻는 한 가지 방법은'df %> % do (data.frame (., y = "A", z = factor ("B"), stringsAsFactors = FALSE))' – akrun

+0

@ mutate'가 올바른 선택이 아닌가? 어떤 추측이라도? – jazzurro

답변

12

dplyr은 실제 mutate 작업을 수행하기 위해 C++을 사용합니다. Followingtherabbithole이 점에 유의하고 ungrouped mutation임을 알게되면 신뢰할 수있는 디버거를 사용하여 다음 사항을 확인할 수 있습니다.

debugonce(dplyr:::mutate_impl) 
# Inside of mutate_impl we do: 
class(dots[[2]]$expr) # which is a "call"! 

이제 우리는 lazy expression 유형을 알고 있습니다. 우리는 eval 전화이며 noticesupported type입니다 (불행히도, R의 TYPEOF 매크로 청구 factors are integers - 우리는 식별을 위해 Rf_isFactor가 필요합니다).

그럼 어떻게 될까요? 우리는 returned the result이고 우리는 끝났습니다. (df %>% mutate(y="A", z=factor(c("A","B"))))[[3]]을 이미 시도한 경우 문제는 실제로 재활용 된 것입니다.

Specifically

은 C++ Gatherer object ( INTSXP들에 현재 날짜 체크 외에 Rf_isFactor 확인 될 should really되는) 생성 될 force a Vector<INTSXP>에 ++ 템플릿을 C를 사용하고 (암시 생성자 초기화 - 스루 ConstantGathererImpl의 인수에 대응 2 호를 통지) 팩터 "라벨"을 가지고 있다는 것을 기억하지 않고.

TLDR : R의 C++에서 정수 및 요인은 TYPEOF 매크로를 사용할 때 내부 유형이 동일하며 요인이 이상한 경우입니다.

dplyr에게 요청을 제출해도 좋습니다. 적극적으로 개발 중이며 hadley와 Romain은 좋은 사람입니다. if 문을 here에 추가해야합니다.

+0

감사합니다. @Robert Krzyzanowski. 나는 C++ 코드로 시작하는 것을 감히하지 않지만 github에서이 문제를 추가했다 : https://github.com/hadley/dplyr/issues/715 –