我正在尝试使用RPostgreSQL包和mapply循环更改许多表的各种列名。我有三个表,其中每个表具有相同的8个通用名称(V1,V2等),我想通过向量new_name
drv <- dbDriver("PostgreSQL")
con = dbConnect(drv, user="postgres", password="mypassword",
host="localhost", port=5433, dbname="BDSC")
为此,我基于this answer创建了以下功能>
rename_col = function(your_table, you_column, new_name){ sql = paste0("DO $$ BEGIN IF EXISTS(SELECT * FROM information_schema.columns WHERE table_name=\'",your_table,"\' and column_name=\'",your_column,"\') THEN ALTER TABLE ",your_table," RENAME COLUMN \"",your_column,"\" TO \"",new_name,"\"; END IF; END $$;") dbSendStatement(con, sql) }
表名,列名和新列名在下面列出
tn = c("afiliados_12", "afiliados_3", "afiliados_5") your_column = paste0("V",1:8) new_name = c("id", "sexo", "birthdate", "nivel", "aprobados", "ecivil", "comuna_dom", "insti")
所以我通过函数
expand.grid
创建了一个索引
mygrid <- expand.grid(y = 1:8, x = 1:3)
最后我将函数
mapply
用于循环
mapply(function(x,y) rename_col(tn[x], your_column[y], new_name[y]), mygrid$x, mygrid$y)
但是,我得到的结果如下
lapply(1:3, function(x) dbListFields(con, tn[x])) [[1]] [1] "id" "V2" "V3" "nivel" "V5" "V6" "comuna_dom" "V8" [[2]] [1] "V1" "sexo" "V3" "V4" "aprobados" "V6" "V7" "insti" [[3]] [1] "V1" "V2" "birthdate" "V4" "V5" "ecivil" "V7" "V8"
虽然我想得到的是
lapply(1:3, function(x) dbListFields(con, tn[x]))
[[1]]
[1] "id" "sexo" "birthdate" "nivel" "aprobados" "ecivil" "comuna_dom" "insti"
[[2]]
[1] "id" "sexo" "birthdate" "nivel" "aprobados" "ecivil" "comuna_dom" "insti"
[[3]]
[1] "id" "sexo" "birthdate" "nivel" "aprobados" "ecivil" "comuna_dom" "insti"
我正在尝试使用RPostgreSQL包和mapply循环更改许多表的各种列名。我有三个表,其中每个表具有相同的8个通用名称(V1,V2,...),我想...
尝试使用lapply
: