Используйте значения в столбце df для создания запроса sql

Я хотел бы взять значения из фрейма данных и вставить их в текстовую строку, которую можно использовать в качестве запроса sql. В SAS я бы сделал это

proc sql noprint; Select Names into :names separated by ", " from df; quit;

это создаст переменную &name, в которой будут храниться все имена. Например: идентификатор, имя, учетная запись. Я хотел бы сделать то же самое в R, но не знаю, как это сделать. Я могу создать вектор с именами, разделенными запятыми, и каждое из них окружено кавычками, я могу убрать кавычки с помощью функции noquote и поместить их в вектор, но я не могу получить элементы в другом операторе вставки, чтобы добавить «ВЫБРАТЬ " и из. Я не могу заставить его все вставить. Есть ли способ вытащить значения из столбца и создать текстовую строку, которую можно использовать в качестве SQL-запроса внутри R? Вот что я пробовал в R:

name = c("Id", "IsDeleted", "Name", "Credit__Loan__c")
label = c("Record Id", "Deleted", "ID", "Loan")
df = data.frame(name, label)
names(df) <- c("name", "label")

as.query.fields = noquote(paste(df$name, collaspe=", "))
as.query.final <- paste("SELECT " , noquote(paste(df$name, collaspe=", ")), " id FROM Credit_Amortization_Schedule__c")

person muraenok    schedule 29.10.2014    source источник
comment
Я думаю, что пакеты whisker или brew будут здесь полезны.   -  person ctbrown    schedule 29.10.2014
comment
Не знаю, понял ли ты, но у тебя collapse написано неправильно (у тебя collaspe), и это влияет на конечный результат. Вам не нужна функция noquote (она влияет только на способ печати объектов), и вы можете передать объект as.query.final непосредственно в вызове sqlQuery (или подобных функций) для выполнения запроса.   -  person nicola    schedule 30.10.2014
comment
Да, спасибо за орфографию. Это была просто опечатка, а не проблема. Кроме того, я использую R для запроса Salesforce (используя rforcecom и soql), поэтому мне действительно нужно контролировать создание оператора Select, поэтому sqlQuery из as.query.final не работает. Единственное, что я могу сделать, это использовать метод cat, чтобы просмотреть, скопировать и вставить результат, а затем удалить запятую перед оператором from. Увы, по лени я надеялся полностью автоматизировать, но не получается. спасибо   -  person muraenok    schedule 30.10.2014


Ответы (2)


Пакет gsubfn поддерживает интерполяцию строк:

library(gsubfn)

Names <- toString( sprintf("%s '%s'", df$name, df$label) )
fn$identity("select $Names from myTable")

давая:

[1] "select Id 'Record Id', IsDeleted 'Deleted', Name 'ID', Credit__Loan__c 'Loan' from myTable"

Вот несколько дополнительных примеров: SO пример 1 и SO пример 2 .

person G. Grothendieck    schedule 29.10.2014
comment
Это прекрасно работает. Спасибо, это как раз то, что я хотел сделать. Он даже автоматически опускает последнюю запятую. Большое спасибо... Я использую запрос на нестандартном языке подзапросов, поэтому мне нужно было точно контролировать результат. - person muraenok; 30.10.2014
comment
Я пытаюсь найти документацию для fn$identity. так что я могу выяснить, как использовать его лучше. Я не видел его на CRAN pdf? Я что-то пропустил? Возможности, которые это открывает для моего кода, я хотел бы узнать больше. Я смотрю на пакет и ничего себе! спасибо... - person muraenok; 30.10.2014
comment
Попробуйте: library(gsubfn); ?fn Также vignette(gsubfn). На главной странице gsubfn.googlecode.com также есть некоторая информация. - person G. Grothendieck; 30.10.2014

data(iris)
colnames(iris)
a <- noquote(paste(colnames(iris), collaspe=", "))
as.query.final <- cat("SELECT " , a, " id FROM Credit_Amortization_Schedule__c")

Результат:

SELECT  Sepal.Length ,  Sepal.Width ,  Petal.Length ,  Petal.Width ,  Species ,   id FROM Credit_Amortization_Schedule__c

который вы затем можете использовать с SQL следующим образом:

require(RODBC)
result <- sqlQuery(db, as.query.final)

где db — подключение к вашей базе данных

Или, поскольку я вижу ваш тег sqldf, если вы хотите использовать sqldf, это просто:

sqldf(as.query.final)
person Hack-R    schedule 29.10.2014
comment
Я вижу, что ваш метод выводит его на экран и работает, но я не могу сохранить значение кота в векторном вызове as.query.final. Когда я печатаю этот вектор, он равен NULL. Я что-то пропустил - person muraenok; 30.10.2014
comment
О, хорошо, хммм, я проверил это с sqlQuery, но, может быть, вы используете его по-другому или что-то в этом роде? Если вы можете вставить ошибку/проблему, которую вы описываете, я помогу вам ее исправить. - person Hack-R; 30.10.2014