【发布时间】:2020-06-24 19:56:32
【问题描述】:
我试图创建一个最小的示例,抱歉。
有没有办法加快这个过程?
我的 procedures 表有 4M 行。我正在处理 15 个小时,它只填充了 150 万行。
可能是用mutate,我不知道。
library(tidyverse)
library(lubridate)
frequencies <- tibble(
id = 1:3,
date_hour_initial = c(
dmy_hms('01/01/2020 13:00:00'),
dmy_hms('01/01/2020 15:00:00'),
dmy_hms('02/01/2020 20:00:00')
),
date_hour_final= c(
dmy_hms('01/01/2020 18:00:00'),
dmy_hms('01/01/2020 22:00:00'),
dmy_hms('03/01/2020 05:00:00')
),
id_person = c("1", "2", "2"),
type_service = c("1", "3", "4")
) %>%
mutate(
intervalo = interval(
date_hour_initial,
date_hour_final
)
)
procedures <- tibble(
id = 1:3,
date_hour = c(
dmy_hms('01/01/2020 17:00:00'),
dmy_hms('01/01/2020 22:00:00'),
dmy_hms('03/01/2020 03:00:00')
),
id_person = c("1", "1", "2")
)
procedures$type_service <- vector(
"character",
nrow(procedures)
)
for(i in 1:nrow(procedures)) {
frequencies %>%
filter(
procedures$date_hour[i] %within% intervalo,
id_person == procedures$id_person[i]
) %>% pull(type_service) %>% unique() -> response
if(length(response) == 1){
procedures$type_service[i] <- response
} else {
procedures$type_service[i] <- NA_character_
}
}
【问题讨论】:
-
您没有进行任何分组或任何需要
dplyr的操作。您是否考虑过为此使用基础 R? -
@cory,不过
baseR也可以做分组操作。 -
@cory 我正在创建一个新专栏。通常我用
dplyr::mutate来做这件事。也许有一种方法可以将我的所有操作封装在一个 mutate 调用中。我什么都想不出来。 -
我认为您希望在两帧之间进行间隔合并。看data.table函数
foverlapsrdocumentation.org/packages/data.table/versions/1.12.8/topics/…。 -
您也可以尝试在 foreach 循环中执行此操作并将其并行化。这是一些文档。 cran.r-project.org/web/packages/doParallel/vignettes/…
标签: r performance loops for-loop dplyr