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

Comparing two dataframes in ddply function

我有两个数据框,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)})

为什么不一次性完成呢?首先创建 quantiles-dataframe,然后再引用它会使事情变得比他们需要的更复杂。你也可以用 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)])
)

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

lapply(x, function(y) {ddply(data,.(year), function(x){  return(sum(x[x[,y] > quantile(x[x[,y]>1,y],0.9),y]))})})

其中 x 是列的大小,即 1:1000data 是包含数据的 df。 quantile(x[x[,y]>1,y],0.9),y]) 将为超过 1 的数据值给出第 90 个百分位数。 x[x[,y] > quantile(x[x[,y]>1,y],0.9),y] returns满足yth列条件的行,用sum函数求和