新手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。
我做错了什么?
答案 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)
}