【问题标题】:Writing multiple data frames into .csv files using R使用 R 将多个数据帧写入 .csv 文件
【发布时间】: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()。

标签: r export-to-csv lapply


【解决方案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 的代码一样单独导出数据帧,并保留与每个数据帧关联的主题编号。
      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2019-09-20
      • 2021-09-06
      相关资源
      最近更新 更多