2015-11-04 56 views
1

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

# 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

以下是我将如何使用dplyr来制作ecdfs和矢量化以获取数据的值。

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

现在你有一个数据帧zx列在列表中的功能。

调用我们的数据函数。我们通过排去,并获得匹配的剪裁和颜色,然后调用克拉功能:

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

有趣的是'dplyr'可以使数据帧,那些名单列,但(据我可以告诉) 'plyr'不能。 –