2016-02-25 1 views
0

У меня есть разное dataframes и то, что я хочу сделать, это:зацикливание функции в списке ф.р. и сохранение результатов в г

  1. применить функцию повторяется раз в каждую dataframe
  2. сохранить результаты каждого повторения на новый dataframe сохраняя имя оригинальной dataframes и добавляя что-то еще, чтобы отличить его

Вот что я пытался до сих пор

# 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) 

То, что я хочу, как результат модифицированного dataframes (в данном случае 10 повторений для каждого ФРА списка), которые будут иметь:

  • имя исходного ФРА
  • нового имя
  • и число итераций

    Нечто подобное originaldfname_newname_n0

Я не могу найти, где я пропадаю. Любая помощь будет глубоко признателен

ответ

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 в соответствии с вашим примером.