如何在 R 中将函数转换为 lapply

How to convert for function into lapply in R

我希望你们能帮助我从循环过渡到更多的 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 系列,但它是比我想象的更令人生畏。

再次感谢!

切换到 *apply 的理由比您想象的要少,除非您喜欢极其紧凑的代码。在大多数情况下,很少或没有时间损失,假设您正确编写循环(预分配 space,不要计算您不需要的东西,等等)。

因此,除了“有疑问时,重新启动”之外,您还可以将“不要使用循环”放入罕见真实事物的壁橱中。除非您使用循环而不是大多数函数的内置矢量化功能。示例:

for (j in 1:100) x[j] = sin(y[j]) 

x = sin(y)