我有一些代码要复制很多次,每个代码都以不同的国家为后缀。
假设3个国家作为一个简单的例子:
country_list <- c('ALB', 'ARE', 'ARG')
我正在尝试创建一系列名为a_m5_ALB
、a_m5_ARE
、a_m5_ARG
等的变量,这些变量具有各种功能,例如应用于reg_math_ALB
、reg_math_ARE
、reg_math_ARG
等的addcol
或round_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 = "_"))
}
其中addcol
和round_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
函数。