在 df 列表上循环一个函数并将结果保存在 r 中

looping a function on a df list and save results in r

我有不同的数据框,我想做的是:

  1. 对每个数据帧重复应用一个函数
  2. 在新数据帧上保存每次重复的结果,保留原始数据帧的名称并添加其他内容以区分它

这是我到目前为止尝试过的方法

 # read all files to list
 dataframes <- dir( pattern = ".txt") 
 list_dataframes <- llply(dataframes, read.csv, header = T, sep =" ", dec=".", na.string = "nd")  
 n <- length(dataframes)

 # apply myfunction 10 times
for (j in 1:10){
modified_list <- llply(list_dataframes, myfunction) 
}
if (j <10){
num.char <- paste("n0", j, sep="")
} else num.char <- paste("n", j, sep="")

# save back data frames
for (i in 1:n)
write.table(file = paste( "newfile/_modified",num.char, ".csv", sep = ""), 
modified_list[i], row.names = F)

我想要的结果是修改后的数据帧(在这种情况下,列表的每个 df 重复 10 次)将具有:

我找不到我遗漏的地方。任何帮助将不胜感激

我认为有两个主要问题:

  • }(上面第 9 行)应该在第二个 for 循环之后;

  • 你的最后一行可能应该引用 modified_list[[i]] 而不是使用单 [ 符号。

因此您的代码应该可以工作(未经测试,针对样式稍作修改):

library(plyr)

# read all files to list
dataframes <- dir(pattern = ".txt") 
list_dataframes <- llply(dataframes, read.csv,
                         header = T, sep = " ", dec=".", na.string = "nd")  
n <- length(dataframes)

# apply myfunction 10 times
for (j in 1:10) {
  modified_list <- llply(list_dataframes, myfunction) 
  # save back data frames
  for (i in 1:n)
    write.table(file = sprintf("newfile/%s_newname_%02d.csv", dataframes[i], j), 
                modified_list[[i]], row.names = FALSE)
}

如果这是代码高尔夫,最后一部分可以减少一点:

for (j in 1:10) {
  mapply(function(df, nm) write.csv(file = sprintf('newfile/%s_newname_%02d.csv', nm, j),
                                    df, row.names = FALSE),
         llply(list_dataframes, myfunction), dataframes)
}

(这不一定使它变得更清晰,但它确实减少了一些事情。如果你在某些时候不想使用 for 循环,请使用它,尽管在这种情况下的性能将是几乎相同。)

注:

  • 请包含所需的库,例如 library(plyr)
  • 虽然 lapply 可以很好地工作,但我仍然使用 llply 来匹配您的示例。