循环列表中的df并返回R中的df

时间:2016-11-08 01:39:51

标签: r loops dataframe

我有一个数据帧列表,并且对于每个数据帧,我想将特定列乘以因子10.我通常使用python,并且在R中完成此操作时遇到了麻烦。在python中它会产生影响这个:

files.list = list(zt2, zt6, zt10, zt14, zt18, zt22)

for (f in files): 
   for (i in 3:ncol(f)){ 
       f[i] = f[i]*10
   }
}
然而,在R中,这只是创建一个df' f'并将我最后一次迭代的df的值存储在其中。在R中这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

你不需要一个双循环,一个就够了:

a <- data.frame(a=1:10,b=2:11,c=3:12)
b <- a*2
c <- a^2

files.list <- list(a,b,c)

for(i in 1:length(files.list)){
  files.list[[i]] <- files.list[[i]]*10
}

检查df的头部:

head(files.list[[1]])

   a  b  c
1 10 20 30
2 20 30 40
3 30 40 50
4 40 50 60
5 50 60 70
6 60 70 80

答案 1 :(得分:1)

看起来你的列数可能有多变,并希望在第10列到第3列之后排10位。我会使用lapply

# Sample data:
files.list = list(mtcars, data.frame(x = letters, y = runif(26), z = rnorm(26)))

files.list = lapply(files.list, function(d) {
    d[3:ncol(d)] = d[3:ncol(d)] * 10
    return(d)
})

这相当于for循环:

for (i in seq_along(files.list)) {
    d = files.list[[i]]
    d[3:ncol(d)] = d[3:ncol(d)] * 10
    files.list[[i]] = d
}

您也可以编写for循环来修改数据框,但这涉及很多括号:

for (i in seq_along(files.list)) {
    files.list[[i]][3:ncol(files.list[[i]])] = files.list[[i]][3:ncol(files.list[[i]])] * 10
}

如果我们使用df[-(1:2)]省略前两列而不是df[3:ncol(df)]来选择第三列到第n列,可以改进它:

for (i in seq_along(files.list)) {
    files.list[[i]][-(1:2)] = files.list[[i]][-(1:2)] * 10
}

答案 2 :(得分:0)

使用lapply的替代解决方案和来自@aldo_tapia的示例数据:

a <- data.frame(a=1:10,b=2:11,c=3:12)
b <- a*2
c <- a^2

files.list <- list(a,b,c)

lapply(files.list,  function(x) x[,3:ncol(x)] * 10)