R Замена имен столбцов на основе совпадающих имен в другом кадре данных - PullRequest
2 голосов
/ 06 февраля 2020

Я хочу переименовать некоторые столбцы в фрейме данных на основе другого фрейма данных. У меня есть 2 кадра данных, один с кодами в качестве имен столбцов и второй с перечнем кодов и строкой.

df = as.data.frame(matrix(NA, 3, 60)) colnames(df) = c(paste0(sprintf("S%s",seq(10,19))), paste0(sprintf("R%s",seq(20,50))), paste0(sprintf("F%s",seq(51,69))))

namelist = as.data.frame(c(paste0(sprintf("B%s",seq(10,19))), paste0(sprintf("R%s",seq(20,50))), paste0(sprintf("A%s",seq(51,69)))))
colnames(namelist) = "Code"
myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))}
namelist$Name = myFun(nrow(namelist))

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

Результат должен быть таким: Сохранение имен столбцов, которые не перечислены в виде кода в списке имен, и замена R20-R50 на строку.

Мне нужно решение, которое действительно собирает код в один фрагмент, потому что я мог бы также объединить коды в столбцы, например R40 + R41, которые не следует переименовывать.

Есть идеи, как это сделать?

1 Ответ

2 голосов
/ 06 февраля 2020

Мы можем использовать match для получения индекса

i1 <- match(colnames(df), namelist$Code)
i2 <- !is.na(i1) # to take care of non matches which are NA
names(df)[i2] <- namelist$Name[i1[i2]]
names(df)
#[1] "S10"        "S11"        "S12"        "S13"        "S14"        "S15"        "S16"        "S17"        "S18"       
#[10] "S19"        "NRROX3720Q" "AJDIO5627R" "PNGQI9045F" "PMRKH3945W" "AWTUS8801K" "FAUSS0775K" "RHMDT7354P" "EHFXN5677T"
#[19] "DEXAD5460Z" "XNPJU6465R" "ISLKV8962F" "ZVAAT4099D" "MWCLD5013G" "MSSCG1315D" "NKJBC5303V" "EDHHR9300M" "CVWHP7658I"
#[28] "BPUSL4348S" "LPEWZ1407A" "QACRV3987M" "XMHYQ8544N" "UJGRX9778J" "KPAYY3203M" "JTETK9509P" "VYNYF6624P" "RDDZD3099N"
#[37] "SHUES3288G" "CGFKB5625F" "WTUEX0452E" "BSDUR3721G" "BZMND9193I" "F51"        "F52"        "F53"        "F54"       
#[46] "F55"        "F56"        "F57"        "F58"        "F59"        "F60"        "F61"        "F62"        "F63"       
#[55] "F64"        "F65"        "F66"        "F67"        "F68"        "F69"       

, т. Е. Если совпадений нет, имя столбца остается таким же

...