在多个文件上将 for 循环更改为 lapply
changing for loop to lapply over several files
我有很多csv文件,我需要读取所有这些文件并在变量中执行一些操作。我使用了“for 循环”,但它花费的时间太长了。我在这里搜索了很多答案,我知道 lapply 会更有效率,但我无法实现它。有人可以帮我吗?
一个文件示例是:
ID Estimate SE avar h2
683 6.17E-02 1.226 1.11 0.19
52 -1.77E-02 1.278 1.11 0.19
我有将近 50 个格式相同但名称不同的文件。我想做的是读取所有文件,创建一个名为 rel 的变量,即:1 -(SE^2)/avar。之后我想根据变量 rel 对数据进行子集化并写入新文件。我试过的是:
myfiles <- list.files(pattern=".csv")
for (j in 1:length(myfiles)) {
this_file <- read.csv(myfiles[j], header = T)
for (i in this_file) {
for (k in 1:dim(this_file)){
this_file["rel"] = 1-((this_file["SE"]*this_file["SE"])/this_file["avar"])
this_file <- subset(this_file, this_file["rel"] >= 0.8*this_file["h2"])
write.csv(this_file, file=this_file)
}}}
我知道这很简单,但我不明白。任何帮助将不胜感激。
谢谢你。
宝拉
这应该会让你接近。我将使用新的文件名矢量,这样我们就不会覆盖您当前的文件。
myfiles <- list.files(pattern = "\.csv$")
## make a vector of new file names 'cat*.csv' where * is 1:length(myfiles)
newfiles <- sprintf("cat%d.csv", seq_along(myfiles))
Map(function(x, y) {
df <- read.table(x, header = TRUE)
df$rel <- with(df, 1 - (SE^2 / avar))
write.table(df[df$rel >= (0.8 * df$h2), ], file = y)
}, x = myfiles, y = newfiles)
我有很多csv文件,我需要读取所有这些文件并在变量中执行一些操作。我使用了“for 循环”,但它花费的时间太长了。我在这里搜索了很多答案,我知道 lapply 会更有效率,但我无法实现它。有人可以帮我吗? 一个文件示例是:
ID Estimate SE avar h2
683 6.17E-02 1.226 1.11 0.19
52 -1.77E-02 1.278 1.11 0.19
我有将近 50 个格式相同但名称不同的文件。我想做的是读取所有文件,创建一个名为 rel 的变量,即:1 -(SE^2)/avar。之后我想根据变量 rel 对数据进行子集化并写入新文件。我试过的是:
myfiles <- list.files(pattern=".csv")
for (j in 1:length(myfiles)) {
this_file <- read.csv(myfiles[j], header = T)
for (i in this_file) {
for (k in 1:dim(this_file)){
this_file["rel"] = 1-((this_file["SE"]*this_file["SE"])/this_file["avar"])
this_file <- subset(this_file, this_file["rel"] >= 0.8*this_file["h2"])
write.csv(this_file, file=this_file)
}}}
我知道这很简单,但我不明白。任何帮助将不胜感激。 谢谢你。 宝拉
这应该会让你接近。我将使用新的文件名矢量,这样我们就不会覆盖您当前的文件。
myfiles <- list.files(pattern = "\.csv$")
## make a vector of new file names 'cat*.csv' where * is 1:length(myfiles)
newfiles <- sprintf("cat%d.csv", seq_along(myfiles))
Map(function(x, y) {
df <- read.table(x, header = TRUE)
df$rel <- with(df, 1 - (SE^2 / avar))
write.table(df[df$rel >= (0.8 * df$h2), ], file = y)
}, x = myfiles, y = newfiles)