如何在应用函数中转换嵌套的 for 循环
Posted
技术标签:
【中文标题】如何在应用函数中转换嵌套的 for 循环【英文标题】:How to convert the nested for loop in apply function 【发布时间】:2022-01-20 08:27:45 【问题描述】:这里我有嵌套循环,我不知道如何将其转换为 apply 任何人都可以告诉我如何将其转换为 apply 函数
plans_achievements <- function(pa_m,pa_q)
if(nrow(pa_m)==0 & nrow(pa_q==0))
df = data.frame(a = c(""), b = c("No Data Available"))
colnames(df)=""
else
pa_m= pa_m%>% select(inc,month_year,Plans,Achievements,quarter_year)
colnames(pa_mon)[2] = "Period"
pa_q= pa_q%>% select(inc,quarter_year,Plans,Achievements)
colnames(pa_qtr)[2] = "Period"
df = data.frame(inc=c(""),Period=c(""),Plans=c(""),Achievements=c(""))
for (q in unique(pa_q$Period))
df1 = pa_q[pa_q$Period==q,]
df1$Period = paste0("<span style=\"color:#288D55\">",df1$Period,"</span>")
df1$Plans = paste0("<span style=\"color:#288D55\">",df1$Plans,"</span>")
df1$Achievements = paste0("<span style=\"color:#288D55\">",df1$Achievements,"</span>")
df = rbind(df,df1)
for (m in unique(pa_m$quarter_year))
if(m==q)
df2 = pa_m[pa_m$quarter_year==q,][-5]
df = rbind(df,df2)
df = df[-1,]
return(df)
DT::datatable(plans_achievements(pa_m[pa_m$inc=="vate",],pa_q[pa_q$inc=="vate",]), rownames = F,escape = FALSE,selection=list(mode ="single",target="row"),options = list(pageLength = 50,scrollX = TRUE,dom = 'tp',ordering=F,columnDefs = list(list(visible=FALSE,targets=c(0) ),list(className = 'dt-left', 目标 = '_all'))))
【问题讨论】:
举例说明您的输入和预期输出对您有很大帮助。从您的代码来看,它不一定是您需要的apply
函数。
df = rbind(df,df2)
有效吗? rbind
尝试绑定不同列名的表时出现错误
@GeorgeSavva 我用示例数据和实际功能更新了代码
@JonnyPhelps 使用编辑后的代码来避免错误
【参考方案1】:
我无法想象你为什么要这样做,那么矢量化函数呢?
注意一些输入错误(pa_mon 而不是 pa_m 等)已在下面更正
plans_achievements2 <- function(pa_m,pa_q)
if(nrow(pa_m)==0 & nrow(pa_q==0))
df = data.frame(a = c(""), b = c("No Data Available"))
colnames(df)=""
else
pa_m= pa_m%>% select(inc,month_year,Plans,Achievements,quarter_year)
colnames(pa_m)[2] = "Period"
pa_q= pa_q%>% select(inc,quarter_year,Plans,Achievements)
colnames(pa_q)[2] = "Period"
df <- pa_q
df$Period <- paste0("<span style=\"color:#288D55\">",df$Period,"</span>")
df$Plans = paste0("<span style=\"color:#288D55\">",df$Plans,"</span>")
df$Achievements = paste0("<span style=\"color:#288D55\">",df$Achievements,"</span>")
return(rbind(df, pa_m[pa_m$quarter_year %in% pa_q$Period,-5])[-1, ])
return(df)
【讨论】:
For 循环在我的应用程序中执行此功能需要花费大量时间,所以只有我听说 apply 比 for 循环更快... unique(pa_q$Period) 根据值有四个值循环应该迭代 这是一个普遍存在的误解。*apply
系列只是被美化的“for-loops”,如果正确实施循环,则不会获得任何性能。只要有可能,向量化就是要走的路,其中向量化描述了使用经过优化以接受多个输入的函数(例如paste0
,它可以接受vector
s 作为输入)。在上面我已经删除了for循环并利用pa_q
中的所有句点都被迭代,paste0
可以处理参数,同时pa_m
只需要pa_q
中也存在的句点,例如@ 987654329@
Bi-comment:使用*apply
函数仍然有充分的理由,因为它们可以提高函数的可读性。在这里,我将使用dfs <- lapply(unique(pa_q$Period), \(x)function here)
并在调用后使用do.call(rbind, dfs)
组合结果。这永远不会是矢量化函数。 :-)
我尝试了@Oliver,但出现了一些错误,请您编辑上面的代码
没有?我已经使用了您上面的示例数据并执行了plans_achievements2(pa_m, pa_q)
(注意2)。这对我来说没有错误。以上是关于如何在应用函数中转换嵌套的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章