2017-01-27 5 views
0

Как и для this post, я хочу сгруппировать кадр данных по ID (скажем Month) и рассчитать среднее и стандартное отклонения для каждой группы. Разница в том, что я хочу, чтобы два столбца Rate 1 и Rate 2 объединялись в одно со средним и sd обоих.Совокупность/группа в один столбец по ID для вычисления среднего и sd по всем столбцам

Name  Month Rate1  Rate2 
Aira  1  12  23 
Aira  2  18  73 
Aira  3  19  45 
Ben  1  53  19 
Ben  2  22  87 

рама Приведенные выше данные должны быть сгруппированы по Month и для каждого месяца вычислить скорость mean над обеими колоннами. Например, среднее значение месяца 1 должно быть (12 + 23 + 53 + 19)/4 = 26,75. Я предполагаю, что подход для sd аналогичен.

Month Mean_rate 
1  26.75 
2  50 
3  32 
+0

Как эти значения попали в столбец 'mean_rate'? Не могли бы вы объяснить свой результат? –

+0

Это должно быть среднее каждого месяца, используя значения из обоих столбцов. Я обновил свой вопрос, чтобы включить пример. Надеюсь, что помогает – CGFoX

+0

Так просто 'library (dplyr); df%>% group_by (месяц)%>% sumize (new = mean (Rate1 + Rate2)/2) '? – Sotos

ответ

1
## Input data frame 
df <- data.frame(Name=sample(letters,5),Month=c(1,2,3,1,2),Rate1=c(12,18,19,53,22),Rate2=c(23,73,45,19,87)) 

## Split data set on month 
df_splitted <- split(df[,3:4],df$Month) 

## Desired Output 
df_out <- data.frame(Month=as.numeric(names(df_splitted)), 
        Mean=sapply(lapply(df_splitted,unlist),mean), 
        sd=sapply(lapply(df_splitted,unlist),sd), 
        stringsAsFactors=FALSE) 
## Plot 
plot(df_out$Month, df_out$Mean, 
ylim=range(c(df_out$Mean-df_out$sd, df_out$Mean+df_out$sd)), 
pch=19, xlab="Measurements", ylab="Mean +/- SD", 
main="Scatter plot with std.dev error bars") 
arrows(df_out$Month, df_out$Mean-df_out$sd, df_out$Month, 
     df_out$Mean+df_out$sd, length=0.05, angle=90, code=3) 

## Explanation 
# Split the data frame into a list of data frame while keeping 
# rows with same month value together 
temp1 <- split(df[,3:4],df$Month) 

# Convert the list of data frames into list of vectors 
temp2 <- lapply(temp1,unlist) 

# For every vector in list it calculates the mean 
sapply(temp2,mean) 

Полученный объект представляет собой вектор, а имена вектора представляют месяц, для которых она вычисляется.

+0

Это работает, но вы могли бы объяснить, делает и каков результирующий тип данных? Я хочу использовать его для рисования графика рассеяния с ошибками. – CGFoX

+0

Пояснение Добавлено – anonR

+0

Извините, я новичок в R, и у меня проблемы с результирующими данными. Когда я хочу построить средства, мне пришлось выделить месяцы для оси x (как числа), а затем получить только средства для оси y (используя 'names()' и 'noname()'). Есть простой способ сделать это? Или можно сохранить результат в кадре данных, как в моем вопросе? – CGFoX