在没有for循环的情况下如何获得相同的结果?

问题描述

我正在寻找另一种方法来获得相同的结果,因为for语句太慢了。

我有以下数据框。

'data.frame':   50000 obs. of  2 variables:
$ user_id: chr  "[email protected]" "[email protected]" ......
$ result : logi  NA NA ......

函数f获取用户ID并返回特定结果。

f <- function(user_id){
 ......
 return(json_result)
}

我想要的结果如下。

'data.frame':   50000 obs. of  2 variables:
$ user_id: chr  "[email protected]" "[email protected]" ......
$ result : chr  "{....}" "{....}" ......

我正在运行类似以下代码的循环,但是速度太慢。

for (t in df$user_id) {
 print(t)
 df$result[df$user_id==t] <- f(t) 
}

每个用户大约需要3秒,而获得50,000个用户则需要3 * 50000秒。

还有其他方法可以更快地获得结果吗?

解决方法

您正在寻找lapply函数:

df$result <- lapply(df$user_id,f)
,

或者,您可以使用purrr的地图函数。

library(tidyverse)
purrr::map(df$user_id,f)

这将输出一个列表,其中每个元素都是函数调用的输出。根据函数的输出,可以使用map变体来输出某种类型的向量。您可以在文档中阅读以下内容:https://purrr.tidyverse.org/reference/map.html