在R中循环以创建转换变量

时间:2015-09-15 20:07:43

标签: r loops dplyr

我有一个包含80个变量的数据集,我想循环其中50个变量的子集并构造返回。我有一个我要构造返回的变量名称列表,并尝试使用dplyr命令mutate在循环中构造变量。具体来说,我的代码是:

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

其中returnvars是我的列表,alldta是我的数据集。当我在循环之外运行这个代码只有一个`i&#39;价值观,它运作正常。代码如下:

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="") ="

我不确定为什么会出现这个问题。我已经研究了许多尝试这样做的方法,并尝试使用lapply的解决方案,但没有成功。

任何帮助将不胜感激!如果有一种简单的方法可以使用其中一个apply命令来执行此操作,那就太棒了。我没有提供数据集,因为我的问题不是数据特定的,我只是试图理解,作为一个相对的R初学者,如何一次构造许多变换后的变量并将它们添加到我的数据框中。

编辑:根据弗兰克的评论,我将代码更新为以下内容:

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中的变量?我试过get(i)和alldta $ get(i),都没有成功。

我仍然愿意(并积极地好奇),更多R风格的方式来完成整个过程,而不是使用循环。

2 个答案:

答案 0 :(得分:0)

在循环中使用mutate可能也不是一个好主意。我不确定mutate是否复制了数据框,但在循环中增长数据框通常不是一个好习惯。而是使用输出创建单独的数据框,然后根据您的逻辑命名列。

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

答案 1 :(得分: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次的任务,这不应该是一个大问题。