如果这是一个如下所示的 Dataframe :
ID ParameterID Time value group_end_time group_start_time
<dbl> <dbl> <dttm> <dbl> <dttm> <dttm>
1 1 1 2022-01-01 10:05:00 1 2022-01-01 10:20:00 2022-01-01 10:05:00
2 1 2 2022-01-01 10:05:00 1 2022-01-01 10:20:00 2022-01-01 09:50:00
3 1 1 2022-01-01 10:10:00 2 2022-01-01 10:20:00 2022-01-01 10:05:00
4 1 2 2022-01-01 10:10:00 2 2022-01-01 10:20:00 2022-01-01 09:50:00
5 1 1 2022-01-01 10:15:00 3 2022-01-01 10:20:00 2022-01-01 10:05:00
6 1 1 2022-01-01 10:20:00 4 2022-01-01 10:20:00 2022-01-01 10:05:00
7 1 1 2022-01-01 10:25:00 5 2022-01-01 10:35:00 2022-01-01 10:20:00
8 1 1 2022-01-01 10:30:00 6 2022-01-01 10:35:00 2022-01-01 10:20:00
9 1 2 2022-01-01 10:30:00 3 2022-01-01 10:35:00 2022-01-01 10:05:00
10 1 2 2022-01-01 11:36:00 4 2022-01-01 11:50:00 2022-01-01 11:20:00
现在我想计算每个ParameterID
的平均值,其含义如下。对于参数的每个group_end_time
,应计算value
的平均值,包括此ParameterID
的所有观测值和Time >= group_start_time & Time < group_end_time
。我的工作方法是引入一个自定义summarise函数:
df %>%
group_by(ID, ParameterID, group_end_time) %>%
summarise(aggregation_function(ID, ParameterID, group_end_time, group_start_time, .))
aggregation_function <- function(id, par_id, end_time, start_time, full_data) {
ret <- full_data %>%
filter(ID == id[[1]] & ParameterID == par_id[[1]] &
Time < end_time[[1]] & Time >= start_time[[1]]) %>%
group_by(PatientID, ParameterID) %>%
summarise(mean = mean(value, na.rm = TRUE)
)
return(ret)
}
输出结果如下:
ret
# A tibble: 5 × 4
# Groups: PatientID, ParameterID [2]
ID ParameterID group_end_time mean
<dbl> <dbl> <dttm> <dbl>
1 1 1 2022-01-01 10:20:00 2
2 1 2 2022-01-01 10:20:00 1.5
3 1 1 2022-01-01 10:35:00 5
4 1 2 2022-01-01 10:35:00 2
5 1 2 2022-01-01 11:50:00 4
虽然这样做是可行的,但对于大型数据集来说,它非常慢,所以我的方法不实用。你有什么想法来加快速度吗?
2条答案
按热度按时间e0bqpujr1#
使用
df
和SQL,下面的基准测试显示它运行速度快了20倍。这可能适用于更大的数据集,也可能不适用,但你可以尝试一下。只需将Note复制并粘贴到R的一个新示例中,然后复制并粘贴下面的代码。注解
xhv8bpkk2#
我们可以用
apply
从R开始算。将原始函数与
apply
进行比较: