Переименуйте несколько столбцов таблицы с помощью R PostgreSQL и mapply - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь изменить различные имена столбцов многих таблиц, используя пакет R PostgreSQL и mapply l oop. У меня есть три таблицы, в каждой из которых есть одинаковые 8 родовых c имен (V1, V2, ...), которые я хочу изменить на имена, указанные в векторе new_name

drv <- dbDriver("PostgreSQL")

con = dbConnect(drv, user="postgres", password="mypassword",
                host="localhost", port=5433, dbname="BDSC")

Для этого я создал следующую функцию, основанную на этом ответе

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 для всех oop

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"        

1 Ответ

0 голосов
/ 16 марта 2020

Попробуйте использовать lapply:

lapply(tn, function(x) rename_col(x, your_column, new_name))
...