R 由ddply中指定的变量定义的函数内部的子集
通常,我需要通过将另一个data.frame(我应用ddply)子集化的变量来子集函数中的data.frame。为了做到这一点,我再次显式地在函数中写入变量,我想知道是否有更优雅的方法来实现这一点。下面我举一个简单的例子来说明我目前的做法R 由ddply中指定的变量定义的函数内部的子集,r,subset,plyr,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,
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)
})
d1plyr
软件包提供的功能使整个拆分/应用/合并构造变得简单。然而,据我所知,您只能拆分一个东西:列表、数据帧和数组
在您的例子中,您试图做的是拆分两个对象,然后mapply
(或Map
),然后重新组合。由于plyr
对于这个更复杂的构造没有现成的解决方案,所以可以在base 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)
#拆分
d1.split这有点奇怪,我承认,只是因为你的测试看起来很奇怪,为什么d2中的x==unique(d$x),因为这是d2中行数的向量l?我不知道你真正想被选中(或不被选中)的是什么。谢谢。实际上,我对这个问题的描述可能有点混乱。我想@flodel很好地理解了我的意思。实际上,我的问题是,我想用相同的变量分割两个数据帧。而且@hadley可能有兴趣评论mapply
insideplyr
:已经实现了吗?也许是未来的版本?不值得吗?已经用mdply
、maply
等实现了。但是它们确实假设您已经有了片段。但是它们似乎对您所称的片段有很大的限制:排列成数据帧或矩阵的向量。这里OP有data.frames的列表,如果我理解正确的话,m*ply
似乎不适合它。是的,没错。我看不到任何明显的方法来扩展它们,以处理所有可能输入的完全通用性。特别是对于数据帧,使用连接通常更容易解决这些问题。