2015-07-23 5 views
3

У меня есть климатические данные, которые были собраны в течение всего года по градиенту высоты. Shaped так:Ревитация и средний расчет

clim <- read.table(text="alti year month week day meanTemp maxTemp minTemp 
350  2011 aug.  31  213 10   14   6 
350  2011 aug.  31  214 12   18   6 
350  2011 aug.  31  215 10   11   9 
550  2011 aug.  31  213 8   10   6 
550  2011 aug.  31  214 10   12   8 
550  2011 aug.  31  215 8   9   7 
350  2011 sep.  31  244 9   10   8 
350  2011 sep.  31  245 11   12   10 
350  2011 sep.  31  246 10   11   9 
550  2011 sep.  31  244 7.5   9   6 
550  2011 sep.  31  245 8   10   6 
550  2011 sep.  31  246 8.5   9   8", header=TRUE) 

и я пытаюсь изменить эти данные для того, чтобы иметь только одну строку за высоту и вычислить средние данные за каждый месяц и в течение всего года. Я бы замечательно, если бы это могло быть в форме, что:

alti mean_year(meanTemp) mean_year(maxTemp) mean_aug.(meanTemp) mean_aug.(maxTemp) mean_sep.(meanTemp) [...] 
350  10.333    12.667    10.667    14.3     10      ... 
550  8.333     9.833    8.667     10.333    7.766     ... 

Любая идея, чтобы выполнить эту перепрофилирования & расчет?

+0

Вы можете изменить данные в более удобные для пользователей для этого мы можем копировать/вставлять в наши собственные сеансы (например, используя 'dput')? –

+0

Привет Roman, user198275 только что изменил данные, поэтому теперь легко вставить в R. Я не знал, что это возможно, отлично !! ;) R. – RPO

ответ

1

Вот еще один вариант data.table решения, но это требует текущего devel version, v1.9.5:

require(data.table) # v1.9.5+ 
setDT(clim) 
form = paste("alti", c("year", "month"), sep=" ~ ") 
val = c("meanTemp", "maxTemp") 
ans = lapply(form, function(x) dcast(clim, x, mean, value.var = val)) 
Reduce(function(x, y) x[y, on="alti"], ans) 

# alti meanTemp_mean_2011 maxTemp_mean_2011 meanTemp_mean_aug. meanTemp_mean_sep. maxTemp_mean_aug. maxTemp_mean_sep. 
# 1: 350   10.333333   12.666667   10.666667     10   14.33333   11.000000 
# 2: 550   8.333333   9.833333   8.666667     8   10.33333   9.333333 
3

Вы можете использовать data.table и dcast:

library(data.table) 

setDT(clim) 

merge(

clim[, list("mean_temp_mean_year" = mean(meanTemp), "max_temp_mean_year" = mean(maxTemp)), by = alti] 
, 
dcast(clim[, list("mean_temp_mean" = mean(meanTemp), "max_temp_mean" = mean(maxTemp)), by = c("alti","month")], alti ~ month, value.var = c("mean_temp_mean","max_temp_mean")) 
, 
by = "alti") 

Я переключил имена некоторых переменных, и вы Col порядок не является совершенным, но может быть заказана/переименован после

2

Чтобы получить средства месяцев или лет, вы можете использовать aggregate, а затем reshape.

Эти два агрегата могут быть вычислены отдельно, а затем merge ставит их вместе:

mon <- aggregate(cbind(meanTemp, maxTemp) ~ month + alti, data=clim, FUN=mean) 
mon.wide <- reshape(mon, direction='wide', timevar='month', idvar='alti') 

yr <- aggregate(cbind(meanTemp, maxTemp) ~ year + alti, data=clim, FUN=mean) 
yr.wide <- reshape(yr, direction='wide', timevar='year', idvar='alti') 

Каждый из этих наборов .wide есть данные, которые вы хотите. Единственный общий столбец alti поэтому мы берем merge по умолчанию:

merge(mon.wide, yr.wide) 
## alti meanTemp.aug. maxTemp.aug. meanTemp.sep. maxTemp.sep. meanTemp.2011 maxTemp.2011 
## 1 350  10.666667  14.33333   10 11.000000  10.333333 12.666667 
## 2 550  8.666667  10.33333    8  9.333333  8.333333  9.833333 
+0

Это решение не дает полного ответа. Ему не хватает совокупных значений только по годам. – SabDeM

+0

@SabDeM Спасибо. См. Редактирование. –

+0

хороший! У вас есть мой голос – SabDeM

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