比较ddply函数中的两个数据帧
Comparing two dataframes in ddply function
我有两个数据框,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)})
为什么不一次性完成呢?首先创建 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:1000
和 data
是包含数据的 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
函数求和
我有两个数据框,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)})
为什么不一次性完成呢?首先创建 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:1000
和 data
是包含数据的 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
函数求和