函数内的子集由ddply中指定的变量组成

时间:2013-11-24 04:24:24

标签: r subset plyr

我经常需要通过变量来对函数内部的data.frame进行子集化,这些变量是我将ddply应用到的另一个data.frame的子集。为此,我明确地再次写入函数内部的变量,我想知道是否有更优雅的方法来做到这一点。下面我将包含一个简单的例子,以显示我目前的做法是什么。

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)
 })

1 个答案:

答案 0 :(得分:2)

plyr包提供了使整个拆分/应用/组合构造变得容易的功能。但是,据我所知,您只能拆分一个的东西:列表,数据框架,数组。

在您的情况下,您要做的是拆分两个对象,然后mapply(或Map),然后重新组合。由于plyr没有为这个更复杂的构造准备好的解决方案,你可以在基础R中做到这一点。这就是我假设人们在plyr出现之前做的事情:

# 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)

由您来决定它是否比您当前的方法更优雅。我所做的任务是为了帮助理解,但如果你愿意,你可以把整个事情写成一个res <- do.call(rbind, Map(FUN, split(d1, ...), split(d2, ...), ...))语句。