Я пытаюсь изменить различные имена столбцов многих таблиц, используя пакет 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"