2016-10-20 8 views
1

Как написать аргумент select без символов обратного хода? Я хотел бы сделать это, чтобы передать этот аргумент из переменной в виде символьной строки.Избегайте обратных символов с помощью dplyr

df <- dat[["__Table"]] %>% select(`__ID`) %>% mutate(fk_table = "__Table", val = 1) 

Изменения аргумента выбора для "__ID" дает эту ошибку:

Error: All select() inputs must resolve to integer column positions. 
The following do not: 
* "__ID" 

К сожалению, _ символов в именах столбцов не избежать, так как данные загружаются из реляционной базы данных (FileMaker) через ODBC и их необходимо записать обратно в базу данных при сохранении имен столбцов.

В идеале, я хотел бы быть в состоянии сделать следующее:

colName <- "__ID"  
df <- dat[["__Table"]] %>% select(colName) %>% mutate(fk_table = "__Table", val = 1) 

Я также попытался eval(parse()):

df <- dat[["__Table"]] %>% select(eval(parse(text="__ID"))) %>% mutate(fk_table = "__Table", val = 1) 

Он бросает эту ошибку:

Error in parse(text = "__ID") : <text>:1:1: unexpected input 
1: _ 
    ^

Кстати, следующее работает, но потом я возвращаюсь к квадрату (все еще с символом обратного хода).

eval(parse(text="`__ID`") 

Ссылка о кавычке символах в R:

+0

Вы должны посмотреть на использование 'select_()' (и других подстановочных версий функций 'dplyr'). – hrbrmstr

+0

Разве это не дубликат этого - http://stackoverflow.com/questions/24569154? – zx8754

ответ

3

Вы можете использовать as.name() с select_():

colName <- "__ID" 
df <- data.frame(`__ID` = c(1,2,3), `123` = c(4,5,6), check.names = FALSE) 
select_(df, as.name(colName)) 
+0

OP хочет передать переменные, а не использовать символьные строки. – hrbrmstr

+0

@hrbrmstr Ну, это должно отлично работать с 'var <-" __ID "; select_ (df, as.name (var)) 'тоже, нет? –

+1

@ StevenBeaupré Спасибо, это именно то, что мне нужно. Я сделал небольшое изменение для вашего ответа, поэтому он использует переменную для хранения имени столбца, но это было просто тривиальное изменение. Спасибо, что сообщили мне о 'as.name()' – Bobby