2015-09-21 1 views
2

У меня есть два кадра данных, Data и quantiles. Data имеет размер 23011 x 2 и состоит из столбцов "year" и "data", где год представляет собой последовательность дней с 1951 года по 2013 год. Quantiles df имеет размер 63x2, состоящий из столбцов "year" и "quantiles", где год составляет 63 строки, т.е. 1951:2013.Сравнение двух данных в функции ddply

Мне нужно сравнить Quantile df против Data df и подсчитать сумму значений данных, превышающую значение квантили для каждого года. Для этого я использую ddply таким образом:

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

Однако код сравнивает только с первым рядом квантиля и не итерация по каждому из года против ФРА данных. Я хочу перебирать каждый год в quantile df и рассчитать сумму данных, превышающую quantile df в каждом году.

Любая помощь будет принята с благодарностью.

Пример проблема - quantile ФР here и Data является pasted here

quantile DF происходит от data, который является 90-го процентиля data Df, превышающей значение, 1

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

Привет, пожалуйста, укажите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). И есть ли данные квантилей, полученные из исходных данных, или из внешнего источника? – Heroka

ответ

0

Почему бы не сделать это за один раз? Сначала создайте файл 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)])) 
}) 

И -по plyr, кажется, заменить dplyr -:

library(dplyr) 


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

Спасибо, Герока за ответ. Это сработало . Однако вы пропустили одно условие, в котором 'quantile' df должно быть больше 1. Хотя я поставил условие и дал ожидаемый ответ. Подробный ответ будет опубликован, чтобы помочь другим парням. Еще раз спасибо. – comquest

0

В дополнение к Heroka ответ выше, если у вас есть 10000 столбцов и нужно перебирать каждый из колонки, вам можно использовать матричные обозначения в этой форме -

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, который содержит DAT а. quantile(x[x[,y]>1,y],0.9),y]) предоставит 90-й процентиль для значений данных, превышающих 1. x[x[,y] > quantile(x[x[,y]>1,y],0.9),y] возвращает строки, которые удовлетворяют условию для столбца yth, и функция sum используется для вычисления суммы.

 Смежные вопросы

  • Нет связанных вопросов^_^