R:Какие функции лучше всего подходят для объединения и усреднения значений в data.frame?
-
20-09-2019 - |
Вопрос
У меня есть data.frame из этого кода:
my_df = data.frame("read_time" = c("2010-02-15", "2010-02-15",
"2010-02-16", "2010-02-16",
"2010-02-16", "2010-02-17"),
"OD" = c(0.1, 0.2, 0.1, 0.2, 0.4, 0.5) )
который производит это:
> my_df
read_time OD
1 2010-02-15 0.1
2 2010-02-15 0.2
3 2010-02-16 0.1
4 2010-02-16 0.2
5 2010-02-16 0.4
6 2010-02-17 0.5
Я хочу усреднить столбец OD по каждому отдельному read_time (обратите внимание, что некоторые реплицируются, другие нет), и я также хотел бы вычислить стандартное отклонение, создав таблицу, подобную этой:
> my_df
read_time OD stdev
1 2010-02-15 0.15 0.05
5 2010-02-16 0.3 0.1
6 2010-02-17 0.5 0
Какие функции лучше всего подходят для объединения таких значений в data.frame?
Решение
Тот самый плир пакет популярен для этого, но базовые функции by()
и aggregate()
тоже поможет.
> ddply(my_df, "read_time", function(X) data.frame(OD=mean(X$OD),stdev=sd(X$OD)))
read_time OD stdev
1 2010-02-15 0.15000 0.07071
2 2010-02-16 0.23333 0.15275
3 2010-02-17 0.50000 NA
Вы можете добавить недостающий бит, чтобы вернуть 0 вместо NA для последнего std.dev.
Кроме того, вам не нужны кавычки (для переменных), которые были у вас при построении data.frame.
Другие советы
Вы можете попробовать пакет data.table.Если вы знаете MySQL, вам будет очень легко освоить все функции, в противном случае основы тоже достаточно хороши ;-)
my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<- ..
вы также можете присоединиться как в одну строку, так и в конце, по вашему желанию.
Другое преимущество:это очень быстро, если у вас большие выборки.Очень быстро... см. документацию, почему.
Это иллюстрирует, как вы можете использовать aggregate
чтобы получить среднее и стандартное отклонение по вашему read_time
.
>aggregate(my_df$OD, by=list(my_df$read_time), function(x) mean(x))
Group.1 x
1 2010-02-15 0.1500000
2 2010-02-16 0.2333333
3 2010-02-17 0.5000000
>aggregate(my_df$OD, by=list(my_df$read_time), function(x) sd(x))
Group.1 x
1 2010-02-15 0.07071068
2 2010-02-16 0.15275252
3 2010-02-17 NA