2017-02-21 28 views
1

Я хочу суммировать 1000 файлов с 40 строками и 20 столбцами. Я хочу создать два сводных файла, каждый из которых сохранит исходное измерение 40x20. Первый файл со средствами и второй со стандартным отклонением каждой позиции в файле по всем 1000 значениям. Из этого сообщения ниже я нашел очень элегантный способ сделать среднее значение во всех файлах (спасибо @josliber), но я изо всех сил стараюсь расширить эту логику до стандартного отклонения.Стандартное отклонение нескольких файлов csv в один файл

Average multiple csv files into 1 averaged file in r

Я в такой степени, что я загрузил свои данные в списке dataframes

csvs <- lapply(list.files(pattern="weather*.csv"), read.csv) 

И Сниженная работали нормально, чтобы получить мой средний итоговый файл. Можем ли мы сделать что-то подобное (или другое), чтобы получить стандартные отклонения.

Reduce("+", csvs)/length(csvs) 

ответ

0

Вы могли бы сделать нечто подобное еще раз, но использовать основные математику за вычисления стандартного отклонения:

# get the means as before 
means <- Reduce("+", csvs)/length(csvs) 

# make a new list of deviations from that known mean 
st.dev <- lapply(csvs, function(x) (x - means)^2) 

# use the list of deviations to calculate the standard deviation matrix 
st.dev <- sqrt(Reduce("+", st.dev)/length(st.dev)) 

Для получения дополнительной информации по математике здесь, поиск Wikipedia для «стандартного отклонения».

+0

Это действительно опрятно, спасибо за обзор статистики. Я сделал много смысла. – ecolog

1

Другой вариант открывает несколько других статистических параметров.

Если вы преобразуете список 40x20 data.frames в массив 40x20x1000, вы можете apply через каждую из 40-миллиметровых «трубок» сверлить в 3-ом измерении.

Используя выборку из трех матриц 2x4:

set.seed(42) 
lst <- lapply(1:3, function(ign) matrix(sample(8), nrow=2)) 
lst 
# [[1]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 8 2 3 4 
# [2,] 7 5 6 1 
# [[2]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 6 3 7 8 
# [2,] 5 4 1 2 
# [[3]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 8 3 4 2 
# [2,] 1 6 7 5 

Используя abind библиотеку, мы можем произвольно связывать вдоль третьей тусклым. (Это где вы бы начать, учитывая, что ваши data.frames уже захвачены в списке. abind одинаково хорошо работает с одинаково размерных data.frames, как это делает с матрицами.)

library(abind) 
ary <- abind(lst, along = 3) 
dim(ary) 
# [1] 2 4 3 

А теперь запустить произвольный функции по каждой «трубе» (по сравнению с «строкой» или «столбец», поскольку большинство из них считают apply). Например, учитывая [1,1] значения в трех слоев 8, 6 и 8, мы ожидали бы следующие статистические данные:

mean(c(8,6,8)) 
# [1] 7.333333 
sd(c(8,6,8)) 
# [1] 1.154701 

Теперь, используя apply:

apply(ary, 1:2, mean) 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 7.333333 2.666667 4.666667 4.666667 
# [2,] 4.333333 5.000000 4.666667 2.666667 
apply(ary, 1:2, sd) 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 1.154701 0.5773503 2.081666 3.055050 
# [2,] 3.055050 1.0000000 3.214550 2.081666 

Это открывает некоторые более статистическое агрегирование ваших 1000 одинаковых размеров данных, предполагая, что индекс в каждом слое значимо сопоставим. Вы могли бы разработать рабочую модель для определения медианы или другого процентиля с Reduce, но довольно легко сделать (скажем) apply(ary, 1:2, quantile, 0.9) для 90-го процентиля.

+0

Большое спасибо за это решение! – ecolog