2017-01-27 2 views
0

Я хочу хранить файлы R-кода внутри столбца фрейма данных R в отношении переменных. Мой dataframe выглядит следующим образом:Могу ли я сохранить код (.R-файл) внутри столбца dataframe?

metadatatable1:

tablename variable  applicableRcode 
table1  address_key  code1.r   
table1  address_key  code2.r   
table1  zipcode   code2.r   
table2  address_key  code3.r   

dataframes - table1 и Таблица2:

table1

address_key zipcode 
234567  560100 
123456  560100 
453678  560100 

table2

address_key 
54274238 
58375235 

возможно ли это т o добавить файл r-кода в качестве значения столбца dataframe и выполнить его, чтобы получить результат ниже?

tablename variable  applicableRcode rcodeOutput 
table1  address_key  code1.r   98.5 
table1  address_key  code2.r   67.2 
table1  zipcode   code2.r   100.0 
table2  address_key  code3.r   22.8 

Я не могу жёстко переменные, мне нужно вывести переменные из этой таблицы метаданных, выборки значений переменных из таблицы он принадлежит, и применять правила, указанные в метаданных, чтобы получить мой выход.

Большое спасибо заранее.

+0

Вы можете сохранить * имя * файла. Как вы хотите «выполнить» это? Как вы бы с 'source (" myfunction.R ")'? Тогда как он возвращает результат? – Spacedman

+0

В этом проблема @Spacedman. Если я могу сохранить имя файла кода R в отношении переменных и запустить код с переменной, я сохраню результат в другом фрейме данных для каждой переменной, а затем присоединяюсь к нему, возможно, используя sqldf .. это возможно? как это сделать ? –

+0

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

ответ

0

Вот три файла, f1, f2 и f3, которые все коды R один вкладыш, которые принимают переменную in1 и хранить их ответ в out:

f1.R 
:::::::::::::: 
out = sqrt(in1) 
:::::::::::::: 
f2.R 
:::::::::::::: 
out = in1*in1 
:::::::::::::: 
f3.R 
:::::::::::::: 
out = in1 * sqrt(in1) 

Вот кадр данных:

> d = data.frame(in1 = c(1,2,3,4,5), f = c("f2.R","f1.R","f3.R","f3.R","f2.R"),stringsAsFactors=FALSE) 
> d 
    in1 f 
1 1 f2.R 
2 2 f1.R 
3 3 f3.R 
4 4 f3.R 
5 5 f2.R 

и вот теперь вы перебираем этот кадр данных и вызвать source:

> lapply(1:nrow(d),function(i){in1=d[i,"in1"];source(d[i,"f"],local=TRUE);out}) 
[[1]] 
[1] 1 

[[2]] 
[1] 1.414214 

[[3]] 
[1] 5.196152 

[[4]] 
[1] 8 

[[5]] 
[1] 25 

Вы можете упорядочить вывод самостоятельно и делать все, что хотите, но основной принцип того, что вы пытаетесь сделать, содержится выше.

+0

Я пробовал это. Я согласен с тем, что решение идеально. Но здесь у меня гораздо более сложная ситуация. Не поможешь? Я редактирую свой вопрос с ситуацией. –

+0

Привет, @Spacedman, Большое спасибо за помощь, я обновил свой вопрос, пожалуйста, дайте мне знать, если я буду звучать логично .. и если это возможно? –

+0

@DebanjanGhosal Если я прав, с вашим обновленным вопросом вам просто нужно создать новую переменную rcodeouput, перейдя через переменную applyRcode, используя источник в качестве функции. Что-то в строках 'metadatable1 $ rcodeOutput <- sapply (metadatatable1 $ applyRcode, function (scripts) source (scripts))'. Если вам нужно использовать имя столбцов 'variable' в качестве аргументов, тогда проиндексируйте количество строк и пропустите их через каждый. – cimentadaj