Суммируйте вектор, а затем добавьте сводную статистику к исходному фрейму данных в R.

Введение:

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

Пример кода:

## Creating our dataframe:
datetime <- c("5/12/2017 16:15:00","5/16/2017 16:45:00","5/19/2017 17:00:00")
datetime <- as.POSIXct(datetime, format = "%m/%d/%Y %H:%M:%S")
values <- c(1,2,3)
df <- data.frame(datetime, values)

## Here's the current output:
head(df)
             datetime values
1 2017-05-12 16:15:00      1
2 2017-05-16 16:45:00      2
3 2017-05-19 17:00:00      3

## And here's the desired output:
head(df1)
             datetime values mean    sd    se
1 2017-05-12 16:15:00      1    2 0.816 0.471
2 2017-05-16 16:45:00      2    2 0.816 0.471
3 2017-05-19 17:00:00      3    2 0.816 0.471

Заранее спасибо!

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


person philiporlando    schedule 20.05.2017    source источник
comment
Создайте новый столбец и назначьте среднее значение следующим образом: df$mean <- mean(df$values). Выполните ту же процедуру для sd и последнего столбца.   -  person R. Schifini    schedule 20.05.2017
comment
Вау, это было слишком просто, спасибо! Я должен был знать лучше... Я застрял, пытаясь понять, как это сделать с помощью dplyr...   -  person philiporlando    schedule 20.05.2017
comment
альтернативно: sd0 <- function(x){sd(x) / sqrt(length(x)) * sqrt(length(x) - 1)}; se0 <- function(x){ sd0(x) / sqrt(length(x))}; df2[c('mean', 'se', 'sd')] <- lapply(list(mean, se0, sd0), function(f) f(df$values))   -  person mt1022    schedule 20.05.2017
comment
Ницца! Мне определенно нужно привыкнуть к lapply().   -  person philiporlando    schedule 20.05.2017


Ответы (2)


Вы можете выполнять задание одновременно. Предположим, у вас уже есть вспомогательная функция для выбора sd и se:

sd0 <- function(x){sd(x) / sqrt(length(x)) * sqrt(length(x) - 1)}
se0 <- function(x){ sd0(x) / sqrt(length(x))}

Тогда вы можете попробовать:

df[c('mean', 'sd', 'se')] <- lapply(list(mean, sd0, se0), function(f) f(df$values))
# > df
#              datetime values mean        sd        se
# 1 2017-05-12 16:15:00      1    2 0.8164966 0.4714045
# 2 2017-05-16 16:45:00      2    2 0.8164966 0.4714045
# 3 2017-05-19 17:00:00      3    2 0.8164966 0.4714045
person mt1022    schedule 20.05.2017
comment
@spacedSparking, из любопытства, почему вы используете предвзятую оценку вместо sd по умолчанию в R. - person mt1022; 20.05.2017
comment
Это хороший вопрос... Я получаю немного разные числа между df$sd <- sd(df$values) и функцией sd0. Я вижу 1 против 0.81 для sd и 0.57 и 0.47 для se... Похоже, что функция sd() предоставляет стандартное отклонение выборки, а функция sd0() предоставляет стандартное отклонение генеральной совокупности... Звучит примерно так? - person philiporlando; 20.05.2017
comment
Это потому, что sd использует sqrt(n - 1) в качестве знаменателя. К вашему сведению, см. руководство ?sd и en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation. - person mt1022; 20.05.2017

Вот решение dplyr, где sd0 и se0 указаны в ответе mt1022:

df %>% mutate("mean"=mean(values),"sd"=sd0(values),"se"=se0(values))
person tatxif    schedule 20.05.2017
comment
Это круто. Спасибо, что поделился! - person philiporlando; 20.05.2017