R - 使用循环创建多个变量

Posted

技术标签:

【中文标题】R - 使用循环创建多个变量【英文标题】:R - Creating multiple variables with loops 【发布时间】:2022-01-22 08:40:23 【问题描述】:

我正在使用 R 为来自网站的数据创建 API 请求,正如您从下面看到的那样,我的代码中有很多重复。这是由网站 API 的限制造成的。

我想创建一个循环,其中文本的内容遍历第一个文本字符串中的年份,并自动创建 Df1 到 Df5。然后,将此字符串传递给 command1,然后传递给 command2,但也不要重复。

希望问题很清楚,您可以提供帮助

谢谢:)

Df1 <- "search \\\“yyy\\\” where year in [2021] and in [\"xxxxxx\"] return zzz"
Df2 <- "search \\\“yyy\\\” where year in [2020] and in [\"xxxxxx\"] return zzz"
Df3 <- "search \\\“yyy\\\” where year in [2019] and in [\"xxxxxx\"] return zzz"
Df4 <- "search \\\“yyy\\\” where year in [2018] and in [\"xxxxxx\"] return zzz"
Df5 <- "search \\\“yyy\\\” where year in [2017] and in [\"xxxxxx\"] return zzz"

Df1 <- command1(query = Df1, token = token)
Df2 <- command1(query = Df2, token = token)
Df3 <- command1(query = Df3, token = token)
Df4 <- command1(query = Df4, token = token)
Df5 <- command1(query = Df5, token = token)

Final_Df1 <- command2(Df1, dbsource = "APISource", format = "api")
Final_Df2 <- command2(Df2, dbsource = "APISource", format = "api")
Final_Df3 <- command2(Df3, dbsource = "APISource", format = "api")
Final_Df4 <- command2(Df4, dbsource = "APISource", format = "api")
Final_Df5 <- command2(Df5, dbsource = "APISource", format = "api")

Data_Frame <- rbind(Final_Df1, Final_Df2, Final_Df3, Final_Df4, Final_Df5)

【问题讨论】:

你应该创建a list of data frames,而不是顺序命名的数据帧。 【参考方案1】:

这个问题看起来好像需要元编程,但实际上并不需要,如果您需要的只是程序其余部分的最终数据帧。 我会这样做:

do_query <- function(y, year, x, z, token, dbsource="APISource", format="api") 
  s <- paste0("search \\\"", y, "\\\" where year in [", year, "] and in [\"", x, "\"] return ", z)
  df <- command1(query=s, token=token)
  command2(df, dbsource = dbsource, format = format)


do_queries <- function(params_list) 
  # the params list is a list of the parameters as named lists
  dfs <- lapply(params_list, function(params) do.call(do_query, params)) # this returns a list of data frames
  rbind(dfs) # this merges them to one single data frame # eventually you have to correct row_names



# use it like this:
# generate the params_list:
params_list <- lapply(rev(2017:2021), function(year) list(y="yyy", 
                                                          year=year,
                                                          x="xxxxx",
                                                          z="zzz"))
# and then call do_queries over it
df <- do_queries(params_list)

好吧,do.call 可能算作元编程。

如果您在这样的功能中想要一个评估级别的分配 在完成的功能之外,理论上,您可以这样做:


assign_strings <- function(years, y="yyy", x="xxxxx", z="zzz") 
  n <- length(years)
  strings <- sapply(years, function(year) paste0("search \\\"", y, "\\\" where year in [", year, "] and in [\"", x, "\"] return ", z))
  for (i in 1:n) 
    assign(paste0("Df", i), strings[i])
  


# Then, 
assign_strings(rev(2017:2021))
# will do exactly what you want for the first.

但是这段代码可读性不是很好。特别是,变量“Df1”,“Df2”,...生成,但你无法在定义的代码中看到它们 以Df1 &lt;- ...Df2 &lt;- ... 的形式出现——所以在搜索它们的起始位置时你会迷路。 因此,最好将所有这些变量放在一个列表中 一起,并给出列表名称,以便您可以像这样称呼它们: dfs["Df1"], dfs["Df2"]Df[1], Df[2] ... 而且您确切地知道创建dfsDf 对象/列表的时间和地点。

【讨论】:

以上是关于R - 使用循环创建多个变量的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用 char 变量创建一个 for 循环来创建多个绘图?

r 在R中循环分配多个变量

使用循环创建多个变量

使用while循环根据R中的重复值创建一个新变量

如何使用R中的循环创建变量A1,A2,...,A100?

在带有pdf输出的r markdown中的for循环中包含多个空行