我有一个包含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风格的方式来完成整个过程,而不是使用循环。
答案 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次的任务,这不应该是一个大问题。