2017-02-07 18 views
0

У меня есть (1) кадр данных со многими столбцами (df), (2) вектор символов, элементы которого могут быть или не быть именами столбцов фрейма данных (search_for_these) и (3) символ, содержащий строки, которые должны заменить каждый элемент вышеупомянутого вектора, если кадр данных содержит указанный столбец (replace_with_these).Условное переименование столбцов фрейма данных

df <- data.frame(
    dat = rep(1:2), 
    bat = seq(1:2), 
    cat = c("foo","bar")) 

search_for_these <- c("dat", "bat", "shoe", "box") 
replace_with_these <- c("cow", "bat2", "shoes", "boxes") 

Моя цель состоит в том, чтобы заменить любой элемент search_for_these найден в colnames(df) со значением, полученным в том же индексе replace_with_these. Желаемый результат Поэтому:

df <- data.frame(
    cow = rep(1:2), 
    bat2 = seq(1:2), 
    cat = c("foo","bar")) 

Я думал использовать dplyr::contains() для этого, но это не ясно, как на самом деле осуществить это.

ответ

2

Мы можем сделать это с match

i1 <- match(colnames(df), search_for_these, nomatch = 0) 
colnames(df)[i1] <- replace_with_these[i1] 
+1

Простой, прозрачный! – QuestionAnswer

+0

@QuestionAnswer Спасибо за комментарий. Вы также можете проверить [здесь] (http://stackoverflow.com/help/someone-answers) – akrun

+0

Когда я реализую это с моими фактическими данными, я нахожу, что colnames (df) [i1] содержит переменные, найденные по индексам в [i1]. Они не обязательно совпадают с индексами имен столбцов, которые необходимо заменить. Другими словами, colnames (df) [i1] показывает неправильные переменные, потому что [i1] является индексом из ** вектора **. Таким образом, colnames (df) [i1] <- replace_with_these [i1] заменяет неправильные значения в именах кодов (df). – QuestionAnswer

0

В то время как мы можем использовать match, мы должны убедиться, что мы заменим элементы, которые подбираются в нашем первоначальном кадре данных, а не индексы вектора соответствия, который может обратитесь к различным переменным в первичном кадре данных!

Как akrun отметил, что мы первые match, но затем мы заменим элементы основного вектора, содержащие спички, используя Подменю [] и %in%:

found <- match(colnames(df), search_for_these, nomatch = 0) 
colnames(df)[colnames(df) %in% search_for_these] <- replace_with_these[found]