我有两个数据框,Data
和quantiles
。 Data
的维度为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
Data
是pasted here
quantile
df来自data
,这是第90个百分位数data
df超过值1
quantile = quantile(data[-c(which(prcp2[,2] < 1)),x],0.9)})
答案 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)])
)