用于在R中循环使用不同后缀的通用变量名的函数



我有一些代码要复制很多次,每个代码都以不同的国家为后缀。

假设3个国家作为一个简单的例子:

country_list <- c('ALB', 'ARE', 'ARG') 

我正在尝试创建一系列名为a_m5_ALBa_m5_AREa_m5_ARG等的变量,这些变量具有各种功能,例如应用于reg_math_ALBreg_math_AREreg_math_ARG等的addcolround_df

for (i in country_list) {

paste("a_m5", i , sep = "_")  <- addcol(paste("reg_math", i , sep = "_"))
}
for (i in country_list) {

paste("a_m5", i , sep = "_")  <- round_df(paste("reg_math", i , sep = "_"))
}

其中addcolround_df定义为:

addcol = function(y){
dat1 = mutate(y, p.value = ((1 - pt(q = abs(reg.t.value), df = dof))*2))
return(dat1)
}
round_df <- function(x, digits) {
numeric_columns <- sapply(x, mode) == 'numeric'
x[numeric_columns] <-  round(x[numeric_columns], digits)
x
}

当任何函数被添加到粘贴变量部分之前的括号中时,循环错误,但如果手动执行,则可以工作,例如

a_m5_ALB <- addcol(reg_math_ALB)

你能帮忙吗?我认为这是函数在循环中的应用,我错了。

错误:

Error in UseMethod("mutate_") : 
no applicable method for 'mutate_' applied to an object of class "character"
Error in round(x[numeric_columns], digits) : 
non-numeric argument to mathematical function

谢谢

从您的示例来看,您确实处于这样一种情况,即所有内容都应该在一个数据帧中。在这里,为每个国家保留单独的变量并不是适合这份工作的工具。假设您将每个国家的数据帧保存为csv,您可以将所有内容重写为:

library(tidyverse)
country_list <- c('ALB', 'ARE', 'ARG') 
read_data <- function(ctry){
read_csv(paste0("/path/to/file/", "reg_math_", ctry)) %>%
add_column(country = ctry)
}
total_df <- map_dfr(country_list, read_data)
total_df %>%
mutate(p.value = (1 - pt(q = abs(reg.t.value), df = dof))*2) %>%
mutate(across(where(is.numeric), round, digits = digits))

它使您可以立即访问所有其他非常适合这种操作的dplyr函数。

最新更新