【发布时间】:2020-11-14 13:13:32
【问题描述】:
我希望你们能帮助我从循环过渡到更多的 r 语言。尽管有多种资源,但我不知道该怎么做。也许我只是错过了一些东西,所以我在这里寻求您的帮助!
问题:
我有一个包含多个元素的列表,我想对其进行迭代,搜索特定的关键词,如果它们存在,则提取与这些命中相关的特定信息。其中缩写后面的数字是时间戳。有没有办法 1) 使用 apply 系列来做到这一点(我正在尝试使用 R 语言变得更有效率);和 2) 整体上更有效的方式?
提前致谢!
例子:
list_a <- list(
"ENRTE 12:34 ONSCNE: 12:43 ENRTE: 13:34 ATHOSP: 14:23",
"ENRTE 13:34 ONSNE: 13:43 ENRTE: 23:23 ATHOSP: 12:32"
)
list_a[[1]][2] <- "ENRTE 23:23 ONSCNE: 14:32 ERNTE: 17:34 ATHOSP: 13:32"
list_a[[2]][2] <- "ENRTE: 12:23 ONSCNE: 17:34 ENRTE: 17:34 ATHOSP: 14:32"
list_a
[[1]]
[1] "ENRTE 12:34 ONSCNE: 12:43 ENRTE: 13:34 ATHOSP: 14:23" "ENRTE 23:23 ONSCNE: 14:32 ERNTE: 17:34 ATHOSP: 13:32"
[[2]]
[1] "ENRTE 13:34 ONSNE: 13:43 ENRTE: 23:23 ATHOSP: 12:32" "ENRTE: 12:23 ONSCNE: 17:34 ENRTE: 17:34 ATHOSP: 14:32"
然后我的循环如下:
k=1
enroute_list = list()
for(i in 1:length(list_a)){
for(j in 1:length(list_a[[i]]){
if(list_a[[i]] %>% str_extract("ENRTE") %>% is.element('ENRTE',.){
list_a[[j]][i] %>%
str_extract("(?<=\\/)[:digit:]{2}") -> hour_enrte
list_a[[j]][i] %>%
str_extract("(?<=\\:)[:digit:]{2}(?=\\:)") -> minute_enrte
list_a[[j]][i] %>%
str_extract("(?<=\\:)[:digit:]{2}(?!\\:)") -> second_enrte
hour_enrte_df <- data.frame(hour_enrte)
minute_enrte_df <- data.frame(minute_enrte)
second_enrte_df <- data.frame(second_enrte)
time_enroute <- cbind(hour_enrte_df, minute_enrte_df, second_enrte_df) %>%
unite(.,enroute,1:3, sep=":")}
while(k <= 10) {
enroute_list[[k]] <- time_enroute
k <- k+1
break
}
enrte <- bind_rows(enrte_list)
}
此循环在整个列表(数百个元素)中搜索 12 个术语,并提取相关信息并在末尾生成一个数据框,如下所示:
type received dispatched enroute onscene enrhsp arrhsp avail closed
1 AH 19:19:22 19:21:35 19:28:39 19:32:51 19:44:20 19:48:03 19:29:06 20:18:39
我的循环工作得很好,但它困扰着我,因为我在任何地方都听到“不要在 R 中使用循环”,所以我想我会尝试挑战自己并过渡到 apply 系列,但这更令人生畏比我想象的要好。
再次感谢!
【问题讨论】: