在 df 列表上循环一个函数并将结果保存在 r 中
looping a function on a df list and save results in r
我有不同的数据框,我想做的是:
- 对每个数据帧重复应用一个函数
- 在新数据帧上保存每次重复的结果,保留原始数据帧的名称并添加其他内容以区分它
这是我到目前为止尝试过的方法
# 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 次)将具有:
原df的名字
新名字
和迭代次数
类似originaldfname_newname_n0
我找不到我遗漏的地方。任何帮助将不胜感激
我认为有两个主要问题:
}
(上面第 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
来匹配您的示例。
我有不同的数据框,我想做的是:
- 对每个数据帧重复应用一个函数
- 在新数据帧上保存每次重复的结果,保留原始数据帧的名称并添加其他内容以区分它
这是我到目前为止尝试过的方法
# 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 次)将具有:
原df的名字
新名字
和迭代次数
类似
originaldfname_newname_n0
我找不到我遗漏的地方。任何帮助将不胜感激
我认为有两个主要问题:
}
(上面第 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
来匹配您的示例。