【发布时间】:2011-07-20 09:32:52
【问题描述】:
如果你有时间,我想再问你一个问题。
我向您展示我之前在之前的问题中已经使用过的常用 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,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
你看,基本上我在这里创建的是出现在“a”到“e”列中的每个不同数字的出现总和的集合,并同时按列 id 中的 id 分组。
在下一步中,我创建了一个如下所示的循环:
for (i in names(df.list))
{
df.list[i]
assign( paste("var",i,sep=""),
(matrix(matrix(unlist(df.list[i])),ncol=nlevels(factor(df[,i])),nrow=3))/10
)
}
它将之前创建的列表中的每个元素除以 10。但是,这只是我想要实现的整个循环的前半部分,但至少它仍然可以正常工作,我对此没有任何问题,只需在此处将这些代码发送到 R ->
vara
varb
varc
vard
vare
当我尝试执行“for (k in 1:3)”部分时,现在更困难的部分来了。所以,让我们尝试再次发送这些行(当然还有整个循环的前半部分)。
for (i in names(df.list))
{
df.list[i]
assign( paste("var",i,sep=""),
(matrix(matrix(unlist(df.list[i])),ncol=nlevels(factor(df[,i])),nrow=3))/10
)
for (k in 1:3)
assign( paste("var",i,k,sep="."),
vari[k,]*5
)
}
我的问题出在vari[k,]*5 行。 (实际上,此时我应该整理出矩阵乘法。)代码无法识别 vari 但是我之前已经定义了i。而且我不打算使用vara、varb、varc...等,因为我需要将其自动化。原因:我将不得不定期刷新我的真实 df 数据框,因此变量的数量可能会随着时间而变化(我不一定只有从 a 到 e 的变量,而是从 a 到 @ 987654333@或a转y等
所以我收到以下错误消息:
Error in assign(paste("var", i, k, sep = "."), vari[k, ] * 5): object 'vari' not found
我在这里错过了什么/做错了什么?我只想引用另一个我已经在同一个循环中创建但仍然无法识别的对象。这里有合适的解决方案吗?
非常感谢
【问题讨论】: