Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 由ddply中指定的变量定义的函数内部的子集_R_Subset_Plyr - Fatal编程技术网

R 由ddply中指定的变量定义的函数内部的子集

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,

通常,我需要通过将另一个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)
 })

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
inside
plyr
:已经实现了吗?也许是未来的版本?不值得吗?已经用
mdply
maply
等实现了。但是它们确实假设您已经有了片段。但是它们似乎对您所称的片段有很大的限制:排列成数据帧或矩阵的向量。这里OP有data.frames的列表,如果我理解正确的话,
m*ply
似乎不适合它。是的,没错。我看不到任何明显的方法来扩展它们,以处理所有可能输入的完全通用性。特别是对于数据帧,使用连接通常更容易解决这些问题。