使用RPostgreSQL和mapply重命名表的几列

问题描述 投票:0回答:1

我正在尝试使用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,...),我想...

r postgresql mapply rpostgresql
1个回答
0
投票

尝试使用lapply

© www.soinside.com 2019 - 2024. All rights reserved.