在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文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行写入CSV?

使用 R 将多个数据帧写入 .csv 文件

用python把list里的数据写入csv

R如何在将csv文件写入磁盘之前估计它的大小

如何用python将九九乘法表写入csv文件中?

在 C# 中将数据写入 CSV 文件