将多个患者的基于时间的数据汇总到R中每位患者的每日平均值

时间:2017-04-20 10:17:05

标签: r time time-series average mean

我有一个如下所示的数据框:

id                time value
01 2014-02-26 13:00:00     6
02 2014-02-26 15:00:00     6
01 2014-02-26 18:00:00     6
04 2014-02-26 21:00:00     7
02 2014-02-27 09:00:00     6
03 2014-02-27 12:00:00     6

数据框包含多个患者全天不同时间戳的情绪评分。

我希望数据框如下所示:

id  2014-02-26 2014-02-27
01        6.25       4.32
02        5.39       8.12
03        9.23       3.18
04        5.76       3.95

在每行上显示患者,在每列中显示数据框中所有日期的每日平均值。如果患者在特定日期没有心情评分,我希望该值为NA。

使用ddply或其他软件包等功能最简单的方法是什么?

df <- structure(list(id = c(1L, 2L, 1L, 4L, 2L, 3L), time = structure(c(1393437600, 
1393444800, 1393455600, 1393466400, 1393509600, 1393520400), class = c("POSIXct", 
"POSIXt"), tzone = ""), value = c(6L, 6L, 6L, 7L, 6L, 6L)), .Names = c("id", 
"time", "value"), row.names = c(NA, -6L), class = "data.frame")

3 个答案:

答案 0 :(得分:2)

根据您的描述,这似乎是您所需要的,

library(tidyverse)

df1 %>% 
  group_by(id, time1 = format(time, '%Y-%m-%d')) %>% 
  summarise(new = mean(value)) %>% 
  spread(time1, new)

#Source: local data frame [4 x 3]
#Groups: id [4]

#     id `2014-02-26` `2014-02-27`
#* <int>        <dbl>        <dbl>
#1     1            6           NA
#2     2            6            6
#3     3           NA            6
#4     4            7           NA

答案 1 :(得分:0)

我建议使用data.table套餐,这种做法非常类似于Sotos&#39; tidiverse解决方案。

library(data.table)

df <- data.table(df)

df[, time1 := format(time, '%Y-%m-%d')]

aggregated <- df[, list(meanvalue = mean(value)), by=c("id", "time1")]
aggregated <- dcast.data.table(aggregated, id~time1, value.var="meanvalue")

aggregated
#  id 2014-02-26 2014-02-27
# 1:  1          6         NA
# 2:  2          6          6
# 3:  3         NA          6
# 4:  4         NA          7

(我认为我的结果不同,因为我的系统在另一个时区运行,我将日期时间对象导入为UTC。)

答案 2 :(得分:0)

在基础R中,您可以将jobaggregate合并为:

reshape