我有一个数据帧列表,并且对于每个数据帧,我想将特定列乘以因子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中这样做的正确方法是什么?
答案 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)