Изменить имена столбцов для списка фрейма данных на основе другого фрейма данных - PullRequest
0 голосов
/ 22 октября 2019

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

Фрейм данных B данных имеет 2 поля. 1) Colname и 2) Измененное имя столбца

Я хочу сравнить имя столбца из фрейма данных B с каждым фреймом даты в списке A и переименовать с измененным именем столбца.

На основеВ некоторых предыдущих ответах я попытался изменить имена столбцов, как показано ниже, и не смог получить желаемый результат.

names(A[[1]]) <- B[match(names(A[[1]]),B[,"Modified column name"]),"Colname"] 

Далее, я хочу повторить это для всех фреймов данных в списке, чтобы переименоватьИмя столбца на основе фрейма данных B.

Обновлено:

Список фрейма данных (A) выглядит следующим образом

list(structure(list(i_id = c(1, 2, 3, 4, 5), i_reason = c("Event off", 
"Event on", "lock", "invalid", "valid"), i_name = c("A", "B", 
"C", "D", "E")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(id = c(6, 7, 8, 9, 10), 
    reasoncode = c("Event off", "Event on", "lock", "invalid", 
    "valid"), `first name` = c("A", "B", "C", "D", "E")), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    identifier = c(11, 12, 13, 14, 15), reasoncode = c("Event off", 
    "Event on", "lock", "invalid", "valid"), `sur name` = c("A", 
    "B", "C", "D", "E")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame")))

Икадр данных (B) с измененными именами выглядит следующим образом:

structure(list(Colname = c("i_id", "i_reason", "i_name", "id", 
"reasoncode", "first name", "identifier", "reasoncode", "sur name"
), `Modified column name` = c("ID", "Reason", "Name", "ID", "Reason", 
"Name", "ID", "Reason", "Name")), row.names = c(NA, -9L), class = c("tbl_df", 
"tbl", "data.frame"))

И желаемый результат будет:

structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15), Reason = c("Event off", "Event on", "lock", "invalid", 
"valid", "Event off", "Event on", "lock", "invalid", "valid", 
"Event off", "Event on", "lock", "invalid", "valid"), Name = c("A", 
"B", "C", "D", "E", "A", "B", "C", "D", "E", "A", "B", "C", "D", 
"E")), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"))

1 Ответ

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

Вы можете попробовать что-то подобное для отдельных элементов списка, что основано на вашей попытке:

names(A[[1]]) <- B$`Modified column name`[match(names(A[[1]]), B$Colname)]

Чтобы изменить имена каждого элемента списка, вы можете поместить вышеуказанное в lapply (я используюnames<- во избежание необходимости использовать return):

clean_B <- lapply(A, function(df){
    `names<-`(df, B$`Modified column name`[match(names(df), B$Colname)])
})

Когда все ваши фреймы данных имеют одинаковые имена столбцов, вы можете использовать do.call с rbind для их объединения:

do.call(rbind, clean_B)

#### OUTPUT ####

# A tibble: 15 x 3
      ID Reason    Name 
   <dbl> <chr>     <chr>
 1     1 Event off A    
 2     2 Event on  B    
 3     3 lock      C    
 4     4 invalid   D    
 5     5 valid     E    
 6     6 Event off A    
 7     7 Event on  B    
 8     8 lock      C    
 9     9 invalid   D    
10    10 valid     E    
11    11 Event off A    
12    12 Event on  B    
13    13 lock      C    
14    14 invalid   D    
15    15 valid     E    

Вы также можете попробовать что-то вроде этого, что является более кратким, хотя и более трудным для понимания:

library(tidyverse)

map_dfr(A,
    ~ rename(., !!! `names<-`(B[[1]], B[[2]])[match(names(.), B[[1]])])
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...