使用plyr应用存储在列表中的函数

时间:2015-11-04 17:09:42

标签: r plyr

我想使用 plyr 使用ecdf()计算多个经验累积分布函数,然后将这些函数适当地应用于数据框中的条目。例如:

# Use the diamonds dataset in ggplot2
library(diamonds)
library(plyr)

# Calculate an ecdf for each combination of cut and color
all_ecdfs <- dlply(diamonds, c("cut", "color"), function(x) ecdf(x$carat))

# Make a dataset of specific diamonds, which I want to compare to the larger set
# My particular subset of diamonds
my_diamonds <- ddply(diamonds, c("cut", "color"), summarise, 
               my.carat=runif(n=1, min=0.5, max=1))

如果我手动执行此操作,它将如下所示:

# Use the ecdf for the first entry: cut=="Fair" and color=="D"
my_diamonds$percentile <- NA
my_diamonds$percentile[my_diamonds$cut=="Fair" & my_diamonds$color=="D"] <- 
            all_ecdfs[["Fair.D"]](my_diamonds$my.carat[my_diamonds$cut=="Fair" & my_diamonds$color=="D"])

似乎应该有一些方法可以使用ldplylapply自动执行此操作,但我无法弄明白。

1 个答案:

答案 0 :(得分:1)

以下是我如何使用dplyr制作ecdf,并进行矢量化以获取数据的值。

#get ecdfs
library(dplyr)
z <- diamonds %>% group_by(cut, color) %>%
                  summarise(x = list(ecdf(carat)))

现在,您有一个数据框z,其功能位于x列的列表中。

在我们的数据上调用该函数。我们按行,获得匹配的剪切和颜色,然后在克拉上调用函数:

z$x[z$cut == my_diamonds$cut & z$color == my_diamonds$color][[1]](my_diamonds$my.carat)