2015-09-15 3 views
0

У меня есть набор данных из 80 переменных, и я хочу, чтобы подмножество из 50 из них и построил возврат. У меня есть список имен переменных, для которых я хочу построить возврат, и я пытаюсь использовать мутацию для команды dplyr для построения переменных в цикле. В частности мой код:Looping in R для создания преобразованных переменных

for (i in returnvars) { 
    alldta <- mutate(alldta,paste("r",i,sep="") = (i - lag(i,1))/lag(i,1))} 

где returnvars мой список, и alldta мой набор данных. Когда я запускаю этот код за пределами цикла только с одним из значений «i», он работает нормально. Код, который выглядит следующим образом:

alldta <- mutate(alldta,rVar = (Var- lag(Var,1))/lag(Var,1)) 

Однако, когда я запускаю его в цикле (например, попытки сделать предыдущую строку кода в 50 раз за 50 различных переменных), я получаю следующее сообщение об ошибке:

Error: unexpected '=' in: 
"for (i in returnvars) { 
alldta <- mutate(alldta,paste("r",i,sep="") =" 

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

Любая помощь была бы высоко оценена! Если есть простой способ сделать это с помощью одной из команд приложения, это было бы здорово. Я не предоставлял набор данных, потому что мой вопрос не зависит от данных, я просто пытаюсь понять, как относительный R-новичок, как построить сразу несколько преобразованных переменных и добавить их в мой фрейм данных.

EDIT: В соответствии с комментариями Фрэнка, я обновил код на следующее:

for (i in returnvars) { 
    varname <- paste("r",i,sep="") 
    alldta <- mutate(alldta,varname = (i - lag(i,1))/lag(i,1))} 

Это исправляет предыдущие ошибки, но я до сих пор не ссылающийся на переменную правильно, так что я получаю ошибку

Error in "Var" - lag("Var", 1) : 
non-numeric argument to binary operator 

Я предполагаю, что R видит мое имя переменной Var как строку, а не как переменную. Как правильно ссылаться на переменную в моем наборе данных alldta? Я попробовал получить (i) и alldta $ get (i), оба без успеха.

Я также по-прежнему открыт (и активно интересуется), больше способов R-стиля для выполнения всего этого процесса, в отличие от использования цикла.

+0

Добро пожаловать в SO. Прежде всего, вы должны прочитать [здесь] (http://stackoverflow.com/help/how-to-ask) о том, как задать хороший вопрос; хороший вопрос имеет лучшие изменения, которые нужно решить, и вы получите помощь. С другой стороны, чтение [this] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) также хорошо. В нем объясняется, как создать воспроизводимый пример в R. Помогите пользователям помочь вам, предоставив часть ваших данных желаемый результат и то, что вы пробовали до сих пор. – SabDeM

+2

Посмотрите на этот вопрос: http: // stackoverflow.com/questions/26003574/r-dplyr-mutate-use-dynamic-variable-names Вы получаете ошибку, потому что не можете создать свой собственный varname слева от '=' (ни внутри 'mutate', ни где-либо еще в R) , – Frank

+0

Это полезный комментарий @Frank, спасибо! Я обновляю вышеуказанный код - он все еще не работает, но теперь проблема в том, что проблема связана скорее с ссылками переменных из циклов, а не с ошибкой, которую я получал раньше. –

ответ

0

После игры вокруг с этим больше, я обнаружил (благодаря предложению Франка), что следующие работы:

extended <- alldta # Make a copy of my dataset 
for (i in returnvars) { 
    varname <- paste("r",i,sep="") 
    extended[[varname]] = (extended[[i]] - lag(extended[[i]],1))/lag(extended[[i]],1)} 

Это еще не очень R-стиле в том, что я использую цикл , но для задачи, которая повторяется только около 50 раз, это не должно быть большой проблемой.

0

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

result = do.call(rbind,lapply(returnvars,function(i) {...}) 
names(result) = paste("r",returnvars,sep="") 
+0

Это похоже на то, что я хочу, но это не работает для меня. Возможно ли, что вы могли обновить свой ответ для моего конкретного случая, где функция: (i-lag (i, 1))/lag (i, 1)), а возвращаемые vars - это список имен переменных внутри alldta (хотя без alldta $ впереди, поэтому мне нужно разобраться, как это сказать R) –