我想使用for循环将某个操作应用于几个(顺序命名的)变量,以缩短下面的代码:
for(i in 1:ncol(data)) {assign(paste('var', i, sep = '.'), my.fun(data[,i]))}
result.1 <- new.fun(var.1)
result.2 <- new.fun(var.2)
result.3 <- new.fun(var.3)
...
那么,如何调用现有变量var.1,var.2,....我也尝试过贴在这里,但那不起作用。
答案 0 :(得分:7)
简短的回答:不要这样做;改为使用列表。
假设data
是data.frame:
vars <- lapply(data, my.fun)
results <- lapply(vars, new.fun)
答案 1 :(得分:6)
要扩展@ Joshua的答案,如果你的数据已经存在var.1,var.2等变量中,那么你可以使用以下代码将它们组合成一个列表:
mydata <- lapply( paste('var.', 1:10, sep=''), get )
或
mydata <- lapply( paste0('var.',1:10), get )
或
mydata <- lapply( sprintf('var.%d',1:10), get )
如果您有var001,var002,......等可变名称,最后一个可以使用"var%03d"
如果您想要列出名单中的条款(不需要,但可以很好),您可以这样做:
names(mydata) <- sprintf('var.%d', 1:10)
现在,如果您想访问列表中的单个元素,可以使用mydata[[3]]
或mydata$var.3
访问该元素。但最大的好处是您现在可以使用lapply
或sapply
或vapply
或其他工具在列表的每个元素上运行相同的功能,如果您想要保存,请复制,删除等数据,你只需要担心一个对象而不需要另一个循环。
对于未来的项目,最好先将数据直接读入或创建到列表中,而不是先创建单个变量。