在R语言 中如何把list对象逐行写入csv文件中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在R语言 中如何把list对象逐行写入csv文件中相关的知识,希望对你有一定的参考价值。
参考技术A 在R 中把list对象逐行写入csv文件中,示例如下:使用 R 将多个数据帧写入 .csv 文件
【中文标题】使用 R 将多个数据帧写入 .csv 文件【英文标题】:Writing multiple data frames into .csv files using R 【发布时间】:2014-12-29 17:23:20 【问题描述】:我已经使用 lapply 将函数应用于多个数据帧:
data.cleaned <- lapply(data.list, shooter_cleaning)
然后根据其主题编号(例如,100)在列表中标记每个结果数据帧:
names(data.cleaned) <- subject.names
我想要做的是根据其主题编号将每个新数据框保存为单独的 .csv 文件。例如,对于主题 100,我希望将 .csv 文件标记为“100.csv” 通常这样做(对于单个数据帧)我只会写(其中 x 是数据帧):
write.csv(x, "100.csv", row.names = F)
但是,显然使用 lapply 为我的数据框列表执行此操作只会产生许多“100.csv”副本,而我希望文件是唯一的,基于它们的主题编号。我如何(使用适用于?)将这些数据帧中的每一个保存到他们自己独特的 .csv 文件中?
【问题讨论】:
可能类似于lapply(seq_along(list), function(i) write.csv(list[[i]], sprintf("%d.csv", i), row.names = FALSE) )
如果您希望文件名都具有相同的统一字符长度,您可以使用sprintf("%03d.csv", i)
这行得通!但是,导出的文件仅以数字命名(例如,1 - 100)。有没有办法在导出的文件名中保留原始主题编号?
是的,使用 names() 代替 seq_along()。
【参考方案1】:
这是一个常见的操作。您需要将数据帧拆分为 list
的数据帧,然后将它们写入许多单独的 csv。我将演示 2 种使用 base R 的方法,以及 2 种使用 tidyverse 的方法。
基础 R
for
循环使迭代非常明确。
# example data.frame
df <- data.frame(x = 1:4, y = c("a", "a", "b", "b"))
# split the dataframe into a list by the y column
l <- split(df, df$y)
# make filepaths from list names, which are unique values of the y column
file_out <- paste0(names(l), ".csv")
# iterate over the list and the vector of list names to write csvs
for(i in 1:length(l))
write_csv(l[[i]], file_out[i])
或者使用mapply()
:
mapply(
function(x, y) write_csv(x, y),
l,
file_out
)
tidyverse 方法
library(tidyverse)
# we pass walk2 two inputs: a list of dataframes (.x) and filepaths (.y)
# `walk` is a silent `map` that doesn't print output to the console
walk2(l, file_out, ~write_csv(.x, .y))
或者,避免中间变量:
df %>%
group_split(y) %>%
walk(~write_csv(.x, paste0(.x$y[1], ".csv")))
【讨论】:
【参考方案2】:如果这有帮助:我有一个包含多个数据帧的环境,并且只有这些数据帧,我想将每个数据帧输出为单独的 CSV 文件。在 Ben 的回答和发现 mget
的帮助下,我能够使用以下代码做到这一点:
for(i in 1:length(ls()))
write.table(
mget(ls()[[i]]),
file = paste0(ls()[[i]], ".csv"),
sep = ";",
qmethod = "double",
row.names = FALSE)
【讨论】:
【参考方案3】:这里有一个self-contained example,与 Richard 的评论一致,但使用列表中数据框的名称作为 CSV 文件的文件名:
# Create a list of n data frames
n <- 10
my_list <- lapply(1:n, function(i) data.frame(x = rnorm(10), y = rnorm(10)) )
# name the data frames
names(my_list) <- letters[1:n]
# save each new data frame as an individual .csv file based on its name
lapply(1:length(my_list), function(i) write.csv(my_list[[i]],
file = paste0(names(my_list[i]), ".csv"),
row.names = FALSE))
【讨论】:
谢谢!这会像上面 Richard 的代码一样单独导出数据帧,并保留与每个数据帧关联的主题编号。以上是关于在R语言 中如何把list对象逐行写入csv文件中的主要内容,如果未能解决你的问题,请参考以下文章