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 <- ...
、Df2 <- ...
的形式出现——所以在搜索它们的起始位置时你会迷路。
因此,最好将所有这些变量放在一个列表中
一起,并给出列表名称,以便您可以像这样称呼它们:
dfs["Df1"]
, dfs["Df2"]
或 Df[1]
, Df[2]
...
而且您确切地知道创建dfs
或Df
对象/列表的时间和地点。
【讨论】:
以上是关于R - 使用循环创建多个变量的主要内容,如果未能解决你的问题,请参考以下文章