gpt4 book ai didi

r - 通过 ddply 中指定的变量在函数内子集

转载 作者:行者123 更新时间:2023-12-02 01:55:50 25 4
gpt4 key购买 nike

我经常需要通过变量对函数内部的 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)
})

最佳答案

plyr包提供了使整个拆分/应用/组合结构变得容易的功能。然而,据我所知,您只能拆分一个事物:列表、data.frame、数组。

在您的情况下,您要做的是拆分两个 对象,然后 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, ...), ...))如果您愿意,请声明。

关于r - 通过 ddply 中指定的变量在函数内子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com