2016-11-08 97 views
0

我有一个数据框列表,对于每个列表,我想将特定列乘以10。我通常使用python,并且在R中完成此操作时遇到问题。在蟒蛇这将是东西这样的效果:遍历df列表并在R中返回df

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中做这件事的正确方法是什么?

+0

Python的大熊猫没有'的NcoI()'。在pandas中,在循环中使用apply:'colrng = list(range(3,len(df.columns))); f [colrng] = f [colrng] .apply(lambda col:col * 10,axis = 1)' – Parfait

回答

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 
+0

并非所有列都乘以10,只有从3到最后一列。在这种情况下,执行'files.list [[i]] [,3:ncol(files.list [[i]])] - files.list [[i]] [,3:ncol(files.list [我]])] * 10' –

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) 
+0

@Parfait编辑。 – Zach

+0

@Parfait当然好了,如果他想要将第三列向前推并且测试数据集有三列,那么它当然只返回一列。 – Zach

+0

对不起,我错误的术语,OP希望只改变第3列,但保留整个DF。 – Parfait

1

看起来你可能有不同数量的列,并且想要t Ø通过10.通过最后一列的多个第3列,我会用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 
}