2016-12-02 4 views
0

Кто-нибудь знает, как скопировать столбец в data.frame и добавить префикс в новый столбец?Скопируйте столбец и добавьте префикс в новый столбец в R с помощью dplyr

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

Причина в том, что я хочу использовать функцию распространения в этих столбцах, но насколько я знаю, функция распространения не сохраняет исходный столбец. То, что я хотел бы:

От в data.frame со следующими именами столбцов:

column_names <- c('var1', 'var2', 'var3') 

К dataframe со следующими столбцами

column_names <- c('var1', 'var2', 'var3', 'prefix_var1','prefix_var3') 

Где столбцы с «приставкой» содержат те же данные, что и их оригинальные столбцы.

То, что я пытался до сих пор, что частично удалось:

sel_columns <- c('var1', 'var3') 

data <- data.frame(var1 = c(12,3,4), var2 = c(123,5435,121), var3 = c(23,456,123)) 

new_data <- data %>% mutate_at(one_of(sel_columns), funs(.)) 
#Error in eval(substitute(expr), envir, enclos) : 
# could not find function "var1" 
#In addition: Warning message: 
#In one_of(sel_columns) : Unknown variables: `var1`, `var3` 


new_data2 <- data %>% select(one_of(sel_columns)) %>% mutate_all(funs(prefix = . * 1)) %>% c(data, .) %>% data.frame 

ответ

0

Мы можем попробовать это в base R

cbind(data, setNames(data[sel_columns], paste0("prefix_", sel_columns))) 

# var1 var2 var3 prefix_var1 prefix_var3 
#1 12 123 23   12   23 
#2 3 5435 456   3   456 
#3 4 121 123   4   123 
+0

Я обнаружил, что это действительно работает на примере я представил, однако для моего примера это привело к data.frame двух столбцов, один, имеющим название «данные», и другие имеют название «V2». Я обнаружил, что с помощью функции c() функции cbind() она работает правильно. – Michael

+0

@ Майкл. Я не уверен, в чем проблема. Можете ли вы опубликовать 'dput (head (data))', чтобы получить реальный набор данных? –

+1

, если вы действительно хотите добавить аромат dplyr: 'bind_cols (data, setNames (data [sel_columns], paste0 (" prefix _ ", sel_columns)))' –

0

Мы можем использовать data.table

library(data.table) 
setDT(data)[, paste0("prefix_", sel_columns) := mget(sel_columns)][] 
# var1 var2 var3 prefix_var1 prefix_var3 
#1: 12 123 23   12   23 
#2: 3 5435 456   3   456 
#3: 4 121 123   4   123 

Или с .SDcols

0

Если вы действительно хотите сделать это в dplyr, вы хотите изучить стандартные оценочные версии глаголов dplyr. @ joel.wilson имеет правильную идею, но если вы делаете это программно и используете трубы, версии SE - это правильный способ сделать это.

data %>% 
    bind_cols(., select_(., .dots = setNames(sel_columns, sprintf("prefix_%s", sel_columns)))) 

 Смежные вопросы

  • Нет связанных вопросов^_^