【问题标题】:How to convert for function into lapply in R如何在R中将函数转换为lapply
【发布时间】: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 系列,但这更令人生畏比我想象的要好。

再次感谢!

【问题讨论】:

    标签: r list loops apply lapply


    【解决方案1】:

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

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

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

    x = sin(y)
    

    【讨论】:

    • 啊,谢谢!我很高兴知道循环并没有那么令人不悦。我想我仍然想继续研究apply() 家庭,只是为了提高我的编程技能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2017-05-09
    • 2015-02-11
    • 1970-01-01
    • 2021-02-16
    • 2011-03-25
    相关资源
    最近更新 更多