Найдите среднее значение столбца для каждых 1000000 отсчетов в R

У меня есть фрейм данных, который имеет следующую структуру с двумя столбцами data1 и data2. Ниже приведены образцы данных:

data1       data2        
800000    1
800030    0.956521739130435
1000000   0.480916030534351
1686626   0.496
1687492   0.174757281553398
2148463   0.0344827586206897
2850823   0.05
2959087   0.0416666666666667

Я хотел бы вычислить среднее значение второй строки, т.е. data2 на каждые 1000000 отсчетов в data1. это означает, что он должен давать среднее значение для первых 2 строк, затем для следующих 3 строк, а затем для следующих 3 строк и так далее ...

На выходе должен быть фрейм данных с последним значением в интервале 1000000 и средним значением data2 в этом интервале: Пример вывода показан ниже:

 800030  0.97826087
 1687492 0.38389110
 2959087 0.04204981

Может ли какая-нибудь помощь сделать это в R?


person chas    schedule 09.04.2013    source источник
comment
Просто мысль: я не знаю, что вы пытаетесь сделать, но разве вы не пытаетесь вычислить взвешенное среднее? то есть для первых наблюдений 1e6 это среднее значение будет (1 * 0,8e6 + 0,95 ... * 30 + 0,48 ... * 199970) / 1e6. Это будет среднее значение первых 1e6 счетчиков, а не среднее значение первых трех различных результатов.   -  person Joris Meys    schedule 09.04.2013


Ответы (3)


Предполагая, что ваши данные находятся в data.frame DF, вы можете использовать функцию aggregate для этого

> with(DF, aggregate(data2, by=list((data1+0.01)%/%1000000), mean ))
  Group.1          x
1       0 0.97826087
2       1 0.38389110
3       2 0.04204981

Чтобы получить значения в столбце, по которому был вычислен mean, вам придется снова использовать aggregate - на этот раз в самом столбце data1. После этого вы можете merge получить два результирующих фрейма данных.

res <- with(DF, merge(aggregate(data1, by = list((data1 + 0.01)%/%1e+06), paste), aggregate(data2, by = list((data1 + 0.01)%/%1e+06), mean), by = "Group.1"))
names(res) <- c("Group", "Values", "Mean")
res
##   Group                    Values       Mean
## 1     0            800000, 800030 0.97826087
## 2     1 1000000, 1686626, 1687492 0.38389110
## 3     2 2148463, 2850823, 2959087 0.04204981
person CHP    schedule 09.04.2013
comment
Спасибо. Мне не нужны все значения, по которым было вычислено среднее значение. Требуется только конечное значение или максимальное значение в интервале, для которого было вычислено среднее значение. - person chas; 09.04.2013

Вы можете сделать что-то вроде этого:

group <- cut(df$data1, c(0,1000000,2000000,3000000))
tapply(df$data2, group, mean)
# (0,1e+06] (1e+06,2e+06] (2e+06,3e+06] 
# 0.81247926    0.33537864    0.04204981 

РЕДАКТИРОВАТЬ: Чтобы автоматически вычислить breaks в seq, вы можете заменить c(0,1000000,2000000,3000000) на что-то вроде:

c(seq(0, max(df$data1), by=1000000),max(df$data1))

РЕДАКТИРОВАТЬ 2: следующее, используя ddplyfrom plyr, вернет как среднее, так и максимальное значение во фрейме данных:

group <- cut(df$data1, c(seq(0, max(df$data1), by=1000000),max(df$data1)))
ddply(df, .(group), summarize, mean=mean(data2), max=max(data2))
#              group       mean   max
# 1        (0,1e+06] 0.81247926 1.000
# 2    (1e+06,2e+06] 0.33537864 0.496
# 3 (2e+06,2.96e+06] 0.04204981 0.050
person juba    schedule 09.04.2013
comment
Спасибо за ответ. Но это образцы данных, а исходные данные содержат намного больше строк, что затрудняет их группировку, как вы это делали в строке кода c (0,1000000,2000000,3000000). - person chas; 09.04.2013
comment
Только что обновил свой ответ, чтобы узнать о способе автоматического вычисления перерывов. - person juba; 09.04.2013
comment
: Это именно то, что мне нужно. Outptu - это массив с координатами из data1 и средним значением data2, то есть (0,1e + 06] 0,81247926. Можно ли получить максимальное значение в интервале и среднее значение в качестве кадра данных? - person chas; 09.04.2013
comment
Отредактировано, чтобы добавить макс и вернуть фрейм данных. - person juba; 09.04.2013
comment
: Не максимальное значение из data2. Мне нужно максимальное значение из данных1, то есть из интервала (0,1e + 06]. Результирующий фрейм данных должен иметь два вектора: один с последней координатой в интервале (0,1e + 06], а другой - со средним значением для данных2 в пределах интервала . - person chas; 09.04.2013
comment
Я изменил свой первоначальный вопрос выше, чтобы сделать его более ясным. - person chas; 09.04.2013

Для разнообразия вот еще одно решение, использующее split:

sapply(split(df,df$data1%/%1e6), function(x)mean(x$data2))
         0          1          2 
0.97826087 0.38389110 0.04204981 

Изменить: или еще проще:

sapply(split(df$data2,df$data1%/%1e6), mean)
person plannapus    schedule 09.04.2013