Переименование столбцов фрейма данных с использованием частичного сопоставления - PullRequest
1 голос
/ 27 мая 2020

Если у меня есть код внизу сообщения, как я могу заменить имена столбцов df1 вторым столбцом df2, используя частичное сопоставление первого столбца df2? Результат должен выглядеть как df3. Весь мой фрейм данных заполнен многими другими именами, помимо .length (например, CS1.1.width, CS2.12.height, et c), но CS #. #. всегда остается в названии.

Затем мне нужно удалить ".length" из имен столбцов.

Я попытался использовать pmatch ниже для первой части вопроса, но результат неверен.

names(df1) <- df2$new[pmatch(names(df1), df2$partial_atch)]

Как бы я go мог об этом? Спасибо.

old <- c("CS1.1.length", "CS1.7.length", "CS1.10.length", "CS1.12.length", "CS2.4.length", "CS2.6.length", "CS2.9.length", "CS2.11.length", "CS1.1.height")
df1 <- data.frame()
for (k in old) df1[[k]] <- as.character()


new <- c("Bob", "Alex", "Gary", "Taylor", "Tom", "John", "Pat", "Mary")
partial_match <- c("CS1.1", "CS1.7", "CS1.10", "CS1.12", "CS2.4", "CS2.6", "CS2.9", "CS2.11")
df2 <- data.frame(Partial_Match = partial_match, Name = new)


new1 <- c("Bob.length", "Alex.length", "Gary.length", "Taylor.length", "Tom.length", "John.length", "Pat.length", "Mary.length", "Bob.height")
df3 <- data.frame()
for (k in new) df3[[k]] <- as.character()

Изменить: количество столбцов в df1 больше, чем количество элементов в partial_match, поэтому в качестве примера добавлен дополнительный столбец в df1.

1 Ответ

0 голосов
/ 27 мая 2020

Вот вариант с str_replace из пакета stringi:

Это работает, потому что вы можете использовать вектор pattern = для замены совпадающим replacement =.

Нам нужно paste на завершающем ., потому что это предотвращает замену CS1.1 CS1.11 и CS1.10.

library(stringi)
stri_replace_all_regex(names(df1),
                       pattern = paste0(as.character(df2$Partial_Match),"\\."),
                       replacement = paste0(as.character(df2$Name),"\\."),
                       vectorize_all = FALSE)
#[1] "Bob.length"    "Alex.length"   "Gary.length"   "Taylor.length" "Tom.length"    "John.length"   "Pat.length"   
#[8] "Mary.length"  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...