Как переименовать несколько столбцов с разными именами столбцов и разным порядком в нескольких кадрах данных на основе словаря в R - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над объединением нескольких наборов данных из разных источников. Имена столбцов в каждом наборе данных (в виде рамок данных) имеют разные имена и имеют разный порядок. Я создал словарь, который содержит все разные имена и общее имя, которым я хочу переименовать исходные имена. Как переименовать исходные имена столбцов, используя словарь в R? Я специально хочу использовать словарь, потому что я могу добавить больше наборов данных (с разными именами столбцов) в будущем, и было бы легко адаптировать словарь.

Я знаю, что могу вручную переименовать каждый столбец, но их много (например, 30), и они могут измениться с добавлением новых наборов данных.

df1 <- data.frame(site = c(1:6), code = c(rep("A",3), rep("B", 3)), result = c(20:25))
df2 <- data.frame(site_no = c(10:19), day = c(1:10), test = c(rep("A", 5), rep("B", 5)), value = c(1:10))
dict <- data.frame(oldName = c("site", "code", "result", "site_no", "day", "test", "value"),  newName = c("site_number", "parameter", "result", "site_number", "day", "parameter", "result"))

Я хотел бы переименовать столбцы в df1 и df2 на основе кадра данных dict, который содержит старые имена (все имена столбцов из df1 и df2) и новыеимена (общие имена для использования).

Результат будет:

colnames(df1)
"site_number" "parameter" "result"

colnames(df2)
"site_number" "day" "parameter" "result"

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Мы можем match имена соответствующих df для старого имени, а затем извлечь новое имя по соответствующим индексам:

names(df1) = with(dict,newName[match(names(df1),oldName)])
names(df2) = with(dict,newName[match(names(df2),oldName)])
print(df1)
print(df2)
1 голос
/ 15 октября 2019

Мы можем использовать rename_all после помещения наборов данных в list. Лучше иметь эти наборы данных в list, чем в глобальной среде

library(dplyr)
library(purrr)
out <- mget(ls(pattern = "^df\\d+$")) %>%
       map(~ .x %>% 
         rename_all(~  as.character(dict$newName)[match(., dict$oldName)]))

Если мы хотим, мы можем изменить имена столбцов в исходном объекте с помощью list2env

list2env(out, .GlobalEnv)
names(df1)
#[1] "site_number" "parameter"   "result"     

names(df2)
#[1] "site_number" "day"         "parameter"   "result"     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...