2014-10-20 9 views
23

dplyr의 이름 바꾸기 함수는 따옴표없는 변수 이름으로 새 열 이름을 전달해야합니다. 그러나 나는 전달 된 인수에 문자열을 붙여 넣어서 열 이름을 구성하는 함수를 가지고 있으므로 문자열이기도합니다. 예를 들어dplyr의 이름 바꾸기 함수에서 문자열로 새 열 이름을 입력하십시오.

내가 '새로운'열 이름이 원하는 반면 나는

a new 
1 1 4 
2 2 5 
3 3 6 

를 얻을 나는이

df <- data.frame(a = 1:3, old = 4:6) 
myFunc(df, 'x') 

를 실행하면 내가이 기능

myFunc <- function(df, col){ 
    new <- paste0(col, '_1') 
    out <- dplyr::rename(df, new = old) 
    return(out) 
} 

있었다라고 내가 만든 문자열 ('x_1'), 즉

a x_1 
1 1 4 
2 2 5 
3 3 6 

어쨌든이 작업이 수행되고 있습니까?

+3

[dplyr 0.3' 발표 (http://blog.rstudio.org/2014/10/13/dplyr-0-3-2/)에서 : "이제 dplyr로 프로그램 할 수 있습니다 - 비표준 평가 (NSE)를 사용하는 모든 함수도'_' [...]로 끝나는 표준 평가 (SE) 트윈을가집니다 [...] 각 함수의 SE 버전은 비슷한 인수를 갖지만 명시 적으로 "인용"해야합니다. " 따라서, 여기서'rename_'이 유용 할 수 있는지 확인하십시오. – Henrik

+0

고마워, 그게 알아두면 좋지만 실제로이 경우 아무 것도 바뀌지는 않아. 전달하는 열이 이전 열 이름 인 경우 작동하지만 rename_을 사용하도록 위 함수를 변경하고 따옴표로 묶음을 사용하면 여전히 동일하게 나타납니다 – user1165199

+2

@ user1165199'colnames (df) [colnames (df) %에서 "old"] <- paste0 ("x", "_")'(필요한 경우 함수에서) 쉽게 이름 벡터를 대체 할 수 있습니다. – akrun

답변

21

나는 이것이 당신이 찾고있는 것이라고 생각합니다. setNames의 사용이 목록에 이름으로 새 값을 사용하는

> myFunc <- function(df, col){ 
+ new <- paste0(col, '_1') 
+ out <- dplyr::rename_(df, .dots=setNames(list(col), new)) 
+ return(out) 
+ } 
> myFunc(data.frame(x=c(1,2,3)), "x") 
    x_1 
1 1 
2 2 
3 3 
> 

참고 :이 @Henrik 제안 rename_로 사용하지만 인수가 있고, 흥미, 이름을 말할 수 있습니다.

+4

잘 모르겠어요 무엇을 'list (col)'가하려고하는 것이다. 간단히'.dots = setNames (col, new)'를하면, 예제가 여전히 작동합니다. 이름을 바꾸는 열이 여러 개인 경우'list()'는 문제를 일으킬 것입니다. 왜냐하면'length (list (col))! = length (new)' – gregmacfarlane

관련 문제