如何在 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)
我希望你们能帮助我从循环过渡到更多的 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)