2013-11-24 1 views
3

종종 ddply를 적용하는 다른 data.frame을 서브 세트하는 변수로 함수 내에서 data.frame을 서브 세트해야합니다. 이렇게하려면 함수 안에 변수를 명시 적으로 다시 작성하고보다 우아한 방법이 있는지 궁금합니다. 아래에는이 작업을 수행하는 현재의 접근 방식을 보여주기위한 간단한 예제가 포함되어 있습니다.ddply에 지정된 변수로 서브 세트

d1<-expand.grid(x=c('a','b'),y=c('c','d'),z=1:3) 
d2<-expand.grid(x=c('a','b'),y=c('c','d'),z=4:6) 

results<-ddply(d1,.(x,y),function(d) { 
    d2Sub<-subset(d2,x==unique(d$x) & y==unique(d$y)) 
    out<-d$z+d2Sub$z 
    data.frame(out) 
}) 
+0

이상하게 보입니다 만, 테스트가 이상하게 보였기 때문에, d2의 행 번호가 vector가 될 것이므로 d2에서 x == unique (d $ x)를 사용해야하는 이유는 무엇입니까? 나는 당신이 실제로 선택하려고하는 (그리고 선택되지 않은) 것을 알아낼 수 없다. –

+0

감사합니다. 실제로 문제에 대한 내 설명은 약간 혼란 스러웠을 것입니다. 나는 @flodel이 내가 의미했던 것을 잘 포착했다고 생각한다. 내 문제는 실제로 두 데이터 프레임을 같은 변수로 나누고 싶다는 것입니다. – danilinares

답변

2

plyr 패키지는 전체 스플릿/적용/결합 구조를 쉽게 만들 수있는 기능을 제공합니다. 그러나 내 지식으로는 하나만 것을 나눌 수 있습니다 : 목록, data.frame, 배열. 귀하의 경우에는

은, 당신이 뭘 하려는지는 mapply (또는 Map는) 다음 재결합 개체를 분할됩니다. 당신까지

# split 
d1.split <- split(d1, list(d1$x, d1$y)) 
d2.split <- split(d2, list(d2$x, d2$y)) 

# apply 
res.split <- Map(function(df1, df2) data.frame(x = df1$x, y = df1$y, 
               out = df1$z + df2$z), 
       d1.split, d2.split, USE.NAMES = FALSE) 

# combine 
res <- do.call(rbind, res.split) 

가있는 경우 결정 : plyr이 더 복잡한 구조를위한 준비가 해결책을 가지고 있지 않기 때문에, 당신은 내가 plyr 밖으로 오기 전에 사람들이 일을하고 가정 방법은 기본 R.에 그것을 할 수 현재 접근 방식보다 더 우아하거나 그렇지 않습니다. 내가 한 과제는 이해력을 높이는 데 도움이되었지만 원하는 경우 전체를 단일 res <- do.call(rbind, Map(FUN, split(d1, ...), split(d2, ...), ...)) 문으로 쓸 수 있습니다.

+1

그리고 @hadley는'plyr' 내부에서'mapply '할 가능성에 대해 언급하고 싶습니다. 이미 구현 되었습니까? 아마 미래의 릴리스로? 그럴 가치가 없어? – flodel

+1

이미'mdply','maply' 등으로 구현되어 있습니다.하지만 그들은 이미 조각을 가지고 있다고 가정합니다. – hadley

+0

그러나 그들은 당신이 * 조각이라고 부르는 것에 매우 제한적이라고 생각합니다 : 벡터는 data.frame이나 행렬로 정렬됩니다. 여기서 OP는 data.frames의 목록을 가지고 있는데, 정확하게 이해한다면'm * ply'가 적합하지 않은 것으로 보입니다. – flodel