我有不同的数据框,我想做的是:
这是我到现在为止所尝试的内容
# 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次)将具有:
和迭代次数
像originaldfname_newname_n0
我找不到我错过的地方。任何帮助将深表赞赏
答案 0 :(得分:1)
我认为有两个主要问题:
}
(上面第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
来匹配您的示例。