Сохранение данных, хранящихся в списке, в отдельные файлы в R - PullRequest
0 голосов
/ 21 января 2020

У меня большой список, merged_fin, содержащий 39 фреймов данных. Наборы данных выглядят так:

> merged_fin[[1]]
    sourceid dstid       speed
1        177     1 0.010604494
2         46     4 0.010794178
3        100     7 0.007286781

> merged_fin[[2]]
    sourceid dstid       speed
1        721    12 0.013830787
2         23    15 0.016334978
3        274    16 0.015247266
...

Я хотел бы сохранить каждый набор данных в этом списке в отдельный файл .rds в моем рабочем каталоге.

  • Пытаясь:
for (i in 1:length(merged_fin)){
saveRDS(merged_fin[[i]])}

Или

saveRDS(merged_fin[[1]])

Я получаю Error in saveRDS(merged_fin[[i]]) : 'file' must be non-empty string.

  • Пытаясь:
lapply(names(merged_fin), function(i)
  saveRDS(merged_fin[[i]], paste0(i, '.rds')))

Я получаю list(), но файл не сохраняется в моем рабочем каталоге.

Примечания: (1) names(merged_fin) выходы NULL; (2) Я изначально закодировал merged_fin как пустой список (merged fin <- list()), прежде чем заполнять его объединенными наборами данных, которые я считывал из разных папок.

  • Имеет ли проблема l ie в том, как я ссылаюсь на элементы списка?
  • Это связано с тем, как merged_fin было первоначально определено?

Спасибо за вашу помощь.

Решение

В моем случае это был просто вопрос именования элементов моего списка, который предложил Минапарам. У меня был вектор, содержащий правильно упорядоченные названия городов, который назывался cities. Я только что сделал names(merged_fin) <- cities, и этого было достаточно, чтобы успешно запустить

lapply(names(merged_fin), function(i)
   saveRDS(merged_fin[[i]], paste0(i, '.rds')))

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Следуя предыдущему ответу, вот пример того, как назначить и затем захватить имена фреймов данных в вашем списке merged_fin. Обратите внимание, что если у вас еще нет отдельных имен для ваших фреймов данных, вы также можете просто назначить их, используя names(merged_fin) <- c("name1", "name2") et c.

df1 <- read.table(h=T, text="
                     sourceid dstid       speed
1        177     1 0.010604494
2         46     4 0.010794178
3        100     7 0.007286781")

df2 <- read.table(h=T, text="
                      sourceid dstid       speed
1        721    12 0.013830787
2         23    15 0.016334978
3        274    16 0.015247266")

# make a list of dataframes
merged_fin <- list(df1, df2)

# see that the names of merged_fin are currently set to NULL
names(merged_fin)
#> NULL


# get the names of all the list-type objects in the workspace that contain the string "df" - we do this because dataframes are stored as lists
names_of_dataframes <- ls.str(mode = "list", pattern = "df")
names_of_dataframes
#> df1 : 'data.frame':  3 obs. of  3 variables:
#>  $ sourceid: int  177 46 100
#>  $ dstid   : int  1 4 7
#>  $ speed   : num  0.0106 0.01079 0.00729
#> df2 : 'data.frame':  3 obs. of  3 variables:
#>  $ sourceid: int  721 23 274
#>  $ dstid   : int  12 15 16
#>  $ speed   : num  0.0138 0.0163 0.0152


# assign the dataframe names back to our list of dataframes
names(merged_fin) <- names_of_dataframes
names(merged_fin)
#> [1] "df1" "df2"


# now we can write out the dataframes to files as each dataframe has a name
lapply(names(merged_fin), function(i)
    saveRDS(merged_fin[[i]], paste0("~/Desktop/", i, '.rds')))
#> [[1]]
#> NULL
#> 
#> [[2]]
#> NULL

Создано в 2020-01-21 с помощью представительный пакет (v0.3.0)

0 голосов
/ 21 января 2020

Я считаю, что вам нужно добавить уникальный аргумент имени файла для saveRDS, чтобы for l oop работал. Просмотр ?saveRDS показывает, что аргумент по умолчанию для file = "", который является пустой строкой, которая выдает ошибку.

for (i in 1:length(merged_fin)){
  saveRDS(merged_fin[[i]], paste0(names(merged_fin[[i]]), ".rds"))
  }
...