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

10

我使用了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"的副本,而我希望文件是唯一的,基于他们的受试者编号。 我怎样(使用apply)将每个这些数据框保存到自己独特的.csv文件中?


也许可以使用以下代码:lapply(seq_along(list), function(i) { write.csv(list[[i]], sprintf("%d.csv", i), row.names = FALSE) }) 如果您想要所有文件名具有相同的字符长度,可以使用sprintf("%03d.csv", i) - Rich Scriven
这个可以运行!然而,导出的文件只是以数字命名(例如1-100)。有没有办法在导出的文件名中保留原始主题编号? - David Johnson
使用names()而不是seq_along()。 - aliawadh980
4个回答

20

以下是一个自包含示例,类似于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的代码一样单独导出数据框,并且保留每个数据框所关联的主题编号。 - David Johnson
我如何在 paste0 中输入整个“保存路径”? - Ed_Gravy
你能做到 paste0("/path", names(my_list[i]), ".csv") 吗? - Ed_Gravy

6

这是一个常见的操作。您需要将数据帧拆分为包含多个数据帧的列表,然后将它们写入多个单独的csv文件中。我将展示2种基于R语言的方法和2种基于tidyverse包的方法。

基于R语言(base 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)
}

1
这里是一个使用purrr在一个tibble中写入多个数据框的reprex示例。
# use functions from the 
# tidyr, stringr and purrr packages
library(tidyverse)
# create fake dataset
expand_grid(cat = c("a","b"),
            lev = "c",
            num = 1:2) %>% 
  # group and nest by `cat`
  group_by(cat) %>% 
  nest() %>% 
  ungroup() %>% 
  # create different file names with
  # the `cat` variable as reference
  # (you can also specify folder paths)
  mutate(file = map_chr(.x = cat,
                        .f = str_replace, 
                        "(.+)","\\1.csv")) %>% 
  # write each nested dataset 
  # in a separate file
  mutate(write = pmap(.l = select(.,x = data, file),
                      .f = write_csv))
#> # A tibble: 2 x 4
#>   cat   data             file  write           
#>   <chr> <list>           <chr> <list>          
#> 1 a     <tibble [2 x 2]> a.csv <tibble [2 x 2]>
#> 2 b     <tibble [2 x 2]> b.csv <tibble [2 x 2]>

reprex package (v2.0.1)于2022年02月02日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接