如何将函数应用于多个数据集train1-train10?

时间:2015-07-15 18:34:05

标签: r for-loop

新手R问题:

我想使用天花板功能在10个训练数据集(train1到train10)的每一个中对y变量进行舍入。

> for (i in 1:10){ x <- get(paste0("train",i)); x$y <- ceiling(x$y) }

上面的代码运行没有错误。但是,当我检查数据集的y值时,我发现它们还没有被舍入:

> head(train1$y)
[1] 29561.06     0.00     0.00  4660.24   440.00   924.60

但如果我试试这个:

> head(x$y)
[1] 29562     0     0  4661   772   440
> head(x$Fold)
[1] 10 10 10 10 10 10

事实证明代码工作正常,但仅限于重命名的数据集&#34; x&#34;在每个循环后被覆盖,而不是数据集train1-train10。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

最好将数据集保存在“列表”中。但是,如果要更新全局环境中的数据对象,则可以选择list2env。我们使用mget在列表中获取“数据集”,使用lapply遍历“列表”并创建新变量“y”,使用list2env更新数据对象。

list2env(lapply(mget(paste0('train', 1:10)), function(x) {
           x$y <- ceiling(x$y)
            x}), envir=.GlobalEnv)

或使用assign

for(i in 1:10) {
     assign(paste0('train', i), `[[<-`(get(paste0('train', i)), 'y', 
               value= ceiling(get(paste0('train', i))$y)),
       envir=.GlobalEnv)}
head(train1,3)
#  y
#1 0
#2 1
#3 1

数据

set.seed(24)
list2env(setNames(lapply(1:10, function(i) 
    data.frame(y= rnorm(5))), paste0('train', 1:10)), envir=.GlobalEnv)

答案 1 :(得分:1)

或......但是非常非常糟糕

for (i in 1:2) {
 tmp =data.frame(x=get(paste0("train",i))$x,y=ceiling(get(paste0("train",i))$y));
 assign(paste0("train",i), tmp)
}