R循环无法识别我已在同一循环中创建的对象
如果你有时间,我想再问你一个问题 我向你们展示了我在之前的问题中已经使用过的常用df数据帧,它是我真实df数据帧的转换、简化版本,在这里很难展示。然而,主要特征仍然相同R循环无法识别我已在同一循环中创建的对象,r,loops,for-loop,R,Loops,For Loop,如果你有时间,我想再问你一个问题 我向你们展示了我在之前的问题中已经使用过的常用df数据帧,它是我真实df数据帧的转换、简化版本,在这里很难展示。然而,主要特征仍然相同 id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3) a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3) b <-c(3,2,1,1,1,1,1,1
id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3)
a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3)
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2)
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,1,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2)
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2)
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,2,1,4)
df <-data.frame(id,a,b,c,d,e)
df
df.list <- lapply(df[,2:6],function(x, id){ t(table(x, id, useNA = "ifany")) }, df$id)
df.list
它将之前创建的列表中的每个元素除以10。然而,这只是我想要实现的整个循环的前半部分,但至少它仍然可以正常工作,我对此没有问题,只需将这些代码发送到R这里->
vara
varb
varc
vard
vare
现在,当我尝试执行“for(k:1:3)”部分时,更困难的部分出现了。所以,让我们再次尝试发送这些行(当然还有整个循环的前半部分)
我的问题在vari[k,]*5
行。(在现实中,我应该在这一点上整理出一个矩阵乘法。)代码不识别vari,但我之前已经定义了I
。我不打算使用vara
,varb
,varc
。。。等等,因为我需要自动化。原因:我必须定期刷新我的实际df数据帧,因此变量的数量可能会随着时间的推移而变化(我不一定只有从a
到e
的变量,而是从a
到f
或a
到y
等
因此,我得到以下错误消息:
Error in assign(paste("var", i, k, sep = "."), vari[k, ] * 5): object 'vari' not found
我在这里错过了什么/做错了什么?我只想引用我在同一个循环中已经创建但仍然无法识别的另一个对象。这里有合适的解决方案吗
非常感谢我想你可以代替
vari[k,]*5
与
但是,您真的需要这样创建变量吗?我担心如果您的数据集变得更大,名称空间会失控。最好只创建一个列表对象,或者使用
new.env
定义您自己的环境,并在此环境中设置变量,而不是全局变量?@hadley我同意。Fr我所看到的向量化循环几乎总是正确的答案
@lazlo看一下这些示例:vari确实无法识别,因为您保存了一个vara、varb、varc、vard……但没有一个vari。名称中的i在这里没有更改为数字 您想要实现的目标可以通过以下方式轻松实现:
lapply(df.list,function(i) i/10*5)
我想这只是一个例子,您的实际代码更复杂。但是,请使用Lappy并记住表是一个矩阵。所有未列出/矩阵的内容都是完全不必要的
> is.matrix(df.list[[1]])
[1] TRUE
如果您真的非常想删除表属性,并且希望给出指定的名称,那么您的代码可以简化为:
VarList <- sapply(names(df.list),function(i){
out <- df.list[[i]]/10*5
out <- matrix(out,ncol(out)) # in case you want to drop all table attributes
colnames(out) <- paste(
paste("var",i,sep=""),
1:ncol(out),
sep=".")
out
},USE.NAMES=TRUE,simplify=FALSE)
这基本上允许您选择数字上的变量作为索引,而矩阵只是根据初始变量的名称。请记住,分配给全局环境并信任名称是非常危险的。谢谢Tim!你是对的,我也有点担心名称空间的大小失控,但仍然有我们还没有找到更好的解决方案。所以我尝试一下这个“new.env”的东西,事实上听起来很棒。然而,这是一个我还不太了解的领域…直到我在“new.env”的深度挖掘一点,你的建议“get”也会很完美,所以谢谢你。不用担心!:)是的,您可以使用
new.env
创建环境对象,然后将其作为envir=
参数传递给assign
、get
、ls
等。。。玩得高兴用一个列表就可以了。不需要在环境中乱搞。谢谢Rob/Hadley,我会查出来的!
lapply(df.list,function(i) i/10*5)
> is.matrix(df.list[[1]])
[1] TRUE
VarList <- sapply(names(df.list),function(i){
out <- df.list[[i]]/10*5
out <- matrix(out,ncol(out)) # in case you want to drop all table attributes
colnames(out) <- paste(
paste("var",i,sep=""),
1:ncol(out),
sep=".")
out
},USE.NAMES=TRUE,simplify=FALSE)
> VarList[["d"]][,1:2]
vard.1 vard.2
[1,] 1.0 1.5
[2,] 1.0 3.0
[3,] 2.5 1.5