比较ddply函数中的两个数据帧

时间:2015-09-21 06:31:34

标签: r plyr

我有两个数据框,DataquantilesData的维度为23011 x 2,由"year""data"列组成,其中年份是1951年至2013年的天数。 Quantiles df的维度63x2由列"year""quantiles"组成,其中年份为63行,即。 1951:2013

我需要将Quantile df与Data df进行比较,并计算超过每年分位数值的数据值之和。为此,我以这种方式使用ddply

ddply(data, .(year), function(y) sum(y[which(y[,2] > quantile[,2]),2]) )

但是,代码仅与第一行分位数进行比较,而不是针对数据df在一年中的每一年进行迭代。 我希望每年在quantile df中迭代,并计算每年超过quantile df的数据总和。

非常感谢任何帮助。

示例问题 - quantile df是here Datapasted here

quantile df来自data,这是第90个百分位数data df超过值1

quantile = quantile(data[-c(which(prcp2[,2] < 1)),x],0.9)})

2 个答案:

答案 0 :(得分:2)

除了上面的Heroka答案,如果你有10,000列并且需要遍历每一列,你可以使用这种形式的矩阵表示法 -

if($points_disp < 1000){
     echo $points_disp;
} else if($points_disp >= 1000) {
     echo round($points_disp/1000,1) . "K";
}

其中$remaining = 15000; $amort = 3600; $sales_mi = 3600; for($remaining += $amort; $remaining > $amort; ($hi = ($remaining-=$amort) < $amort ? $remaining : $amort) . (($hi == $sales_mi) ? $data = array('amount'=>$hi) : 'No') ); print_r($data); 是列的大小,即lapply(x, function(y) {ddply(data,.(year), function(x){ return(sum(x[x[,y] > quantile(x[x[,y]>1,y],0.9),y]))})}) x是包含数据的df。 1:1000将为超过data的数据值提供第90个百分位数。 quantile(x[x[,y]>1,y],0.9),y])返回满足1列条件的行,x[x[,y] > quantile(x[x[,y]>1,y],0.9),y]函数用于计算总和。

答案 1 :(得分:1)

为什么不一气呵成呢?首先创建quantiles - 数据框然后再引用它会使事情变得比它们需要的更复杂。您也可以使用ddply执行此操作。

set.seed(1)
data <- data.frame(
  year=sample(1951:2013,23011,replace=T),
  data=rnorm(23011)
)


res <- ddply(data,.(year), function(x){
  return(sum(x$data[x$data>quantile(x$data,.9)]))
})

-as plyr似乎被dplyr取代 - :

library(dplyr)


res2 <- mydf %>% group_by(year) %>% summarise(
  test=sum(value[value>quantile(value,.9)])
)