2013-03-14 3 views
2

공백이있는 변수 이름을 포함하는 객체와 명명 된 변수 모두를 ddply로 전달할 수 있습니까? 여기에 내가 무엇을 의미하는지의 예입니다ddply - 객체에 포함 된 변수 이름의 공백

> library(plyr) 
> dat <- data.frame(id1=rep(c("A","B"),8),id2=rep(c("C","D","E","F"),4),x=rnorm(16)) 
> vname <- "id2" 
#works without spaces 
> ddply(dat,c("id1",vname),colwise(sum)) 
    id1 id2   x 
1 A C -1.1215505 
2 A E -1.4507586 
3 B D 1.5064013 
4 B F -0.5428153 
> vname <- "id 2" 
> names(dat)[2] <- vname 
#breaks with spaces 
> ddply(dat,c("id1",vname),colwise(sum)) 
Error in parse(text = x) : <text>:1:4: unexpected numeric constant 
1: id 2 
    ^
#backticks work when manually entering the name 
> ddply(dat,c("id1","`id 2`"),colwise(sum)) 
    id1 id 2   x 
1 A C -1.1215505 
2 A E -1.4507586 
3 B D 1.5064013 
4 B F -0.5428153 
#backticks don't work when pointing to object containing name 
> ddply(dat,c("id1",`vname`),colwise(sum)) 
Error in parse(text = x) : <text>:1:4: unexpected numeric constant 
1: id 2 
    ^
+1

그렇게하는 것이 훨씬 쉽고 형식이 올바른 열 이름을 사용하는 것이 훨씬 쉽습니다. – joran

+0

에 동의했지만 실제로이 특정 인스턴스에서는 성가 시게됩니다. 일시적으로 이름을 조정하여 해결 방법을 찾을 수 있지만 이렇게하려면 조건문을 많이 사용하지 않는 것이 좋습니다. – David

답변

2

당신은이 작업을 수행 할 수는 있지만, 못생긴 외모 :

ddply(dat,c("id1",paste("`",vname,"`",sep='')),colwise(sum)) 
    id1 id 2   x 
1 A C 1.3719443 
2 A E -0.3264330 
3 B D -0.3231757 
4 B F -0.6807928 

제대로 이름 형식의 주석 사용에 말했듯이.

+0

이 정확한 문맥에서 볼 수는 있지만 대체로 못 생겼습니다. 감사! – David

+0

@ user2167315 정말 기분이 이상합니다. 열의 이름을 바꿀 수없는 컨텍스트는 무엇입니까? (그리고 내가 추한 말을 할 때 나는 농담을하기 때문에 아무런 공격도하지 않는다). – agstudy

+0

이름을 바꿀 수는 있지만 그렇게하는 것이 성가시다. 보기 좋은 제목/레이블/등이 필요한 대화식보고 인터페이스 용입니다 ... 그래서 변수는 결국 그 방법으로 이름을 지정해야합니다. 이름을 변경하는 변수/그래프/테이블의 다양한 조합이 있기 때문에 변수를 변경하는 방법에 대한 일련의 조건문이 필요합니다. – David

2

비 신택 틱 (non-syntatic) 이름이 모든 기능 및 패키지에서 제대로 작동한다고 기대할 수는 없습니다.

그들은, 그러나, data.table 함께 작동합니다,

사용 data.table 대신. 당신은 당신이

을했던 함수를 만들 수있는 문자 벡터

을 생성합니다 다음 plyr

as.character(as.name(vname)) 

을 고수하고 싶었다면 colwise(fun)의 상당 lapply(.SD, fun)

dat <- data.frame(id1=rep(c("A","B"),8), 
      "id 2"=rep(c("C","D","E","F"),4),x=rnorm(16), check.names= FALSE) 

    library(data.table) 
    DT <- data.table(dat) 
    vname <- "id 2" 
    DT[,lapply(.SD, sum) , by = c('id1',vname)] 

입니다

charN <- function(x) as.character(as.name(x))