将存储在列表中的数据帧保存到 R 中的单个文件
Saving dataframes stored in a list to individual files in R
我有一个很大的列表,merged_fin
,包含 39 个 data.frames。数据集如下所示:
> 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()
),然后用我从不同文件夹读取的合并数据集填充它。
- 问题是否出在我引用列表元素的方式上?
- 是不是因为
merged_fin
最初的定义方式?
感谢您的帮助。
解决方案
就我而言,这只是一个命名列表元素的问题,这是 meenaparam 建议的。我有一个包含正确排序的城市名称的向量,它被称为 cities
。我刚刚做了 names(merged_fin) <- cities
,这足以成功 运行
lapply(names(merged_fin), function(i)
saveRDS(merged_fin[[i]], paste0(i, '.rds')))
继上一个答案之后,这里有一个示例,说明如何在 merged_fin
列表中分配和获取数据帧的名称。请注意,如果您还没有数据框的单独名称,您也可以使用 names(merged_fin) <- c("name1", "name2")
等简单地分配它们。
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
由 reprex package (v0.3.0)
于 2020 年 1 月 21 日创建
我有一个很大的列表,merged_fin
,包含 39 个 data.frames。数据集如下所示:
> 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()
),然后用我从不同文件夹读取的合并数据集填充它。
- 问题是否出在我引用列表元素的方式上?
- 是不是因为
merged_fin
最初的定义方式?
感谢您的帮助。
解决方案
就我而言,这只是一个命名列表元素的问题,这是 meenaparam 建议的。我有一个包含正确排序的城市名称的向量,它被称为 cities
。我刚刚做了 names(merged_fin) <- cities
,这足以成功 运行
lapply(names(merged_fin), function(i)
saveRDS(merged_fin[[i]], paste0(i, '.rds')))
继上一个答案之后,这里有一个示例,说明如何在 merged_fin
列表中分配和获取数据帧的名称。请注意,如果您还没有数据框的单独名称,您也可以使用 names(merged_fin) <- c("name1", "name2")
等简单地分配它们。
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
由 reprex package (v0.3.0)
于 2020 年 1 月 21 日创建