【问题标题】:Exporting large list of dataframes to csv after split拆分后将大量数据帧导出到 csv
【发布时间】:2021-07-11 14:30:42
【问题描述】:

我正在创建一个脚本,该脚本将根据“参与者 ID”列将数据帧分成组,并将这些数据帧导出为 csvs。现在,我正在使用一个只有 7 个参与者 ID 的数据框,但该脚本将用于具有数百个参与者的 csv。

首先,这是一个数据框列表:

participant_id <- c("1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "4")

text <- c("Message1","Message1","Message1",
 "Message2", "Message2", "Message2", 
 "Message3", "Message3", "Message3", 
 "Message4", "Message4", "Message4")

df <- data.frame(participant_id, text)

df_list <- split(df, df$participant_id)

然后我使用我编写的名为 clean_log 的函数清理列表中的每个数据帧(数据帧包含短信日志):

df_list <- lapply(df_list, clean_log)

我想将此列表中的每个数据帧写入 csv,但数据帧需要先保存为对象。我试着给它们命名:

names <- c()

for (i in 1:length(df_list)) {
  names <- c(names, paste0("df", i))
}

names(df_list) <- names

然后我尝试在 for 循环中导出数据帧,但收到错误“get(names[i]) 中的错误:找不到对象‘df1’:

for (i in 1:length(names)) {
  write.csv(get(names[i]),
            paste0(path, names[i], ".csv"), row.names = FALSE)
}

我知道我可以简单地写

df1 <- df_list[1]
df2 <- df_list[2]
...

为每个数据框命名,但是当有数百个数据框要导出时,这将不起作用。有没有人遇到过这样的问题或有什么建议?

【问题讨论】:

  • 是的,这是一个非常容易解决的问题。请阅读此内容并至少提供一个 df_list 示例。另外,你需要所有这些 csv 吗?您可以保留主文件并根据需要拆分吗? stackoverflow.com/help/minimal-reproducible-example
  • 我刚刚更新了代码以希望遵循这些准则,让我知道它的外观!我需要将每个导出为单独的 csv 以上传到谷歌驱动器。

标签: r dataframe dplyr split


【解决方案1】:

您不需要在这里使用get,通常使用get 是一种不好的做法。

您的对象df_list 是一个数据框列表。 write.csv 的第一个参数应该是您要保存的数据框。所以你可以把你的循环写成:

paths = paste0(path, names, ".csv")
for (i in seq_along(df_list)) {
  write.csv(df_list[[i]], paths[i], row.names = FALSE)
}

我取消了循环中的 paste0 调用,因为使用矢量化来创建文件路径更有效且更惯用。

【讨论】:

  • 不客气。在这种情况下,请接受答案,以便其他人知道此问题已解决。
  • 是的 [[ ]] 是关键。在许多情况下都很有用。
  • 为什么通常使用get 是一种不好的做法?
  • get 函数通过名称获取变量,但更清楚的是...只需键入变量的名称即可。我也经常看到人们使用get,因为他们还没有完全内化何时以及如何使用(命名)列表,就像在这个问题中一样。在日常编程中使用get 的案例确实不多。它的主要用例是处理环境,一种特定类型的 R 对象。
  • 有谁知道如何以这种方式导出html或pdf文件而不是csv?尝试将 csv 格式化为更易于阅读。
猜你喜欢
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2017-01-30
  • 2017-04-15
  • 2018-11-29
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多