如何写入每个拆分块的 csv?

How to write to csv each split chunk?

我有使用 split:

的列表数据
x <- split(A, f = A$Col_1)

效果很好。但现在我需要将拆分的每个块写入一个单独的 .csv。有 2100 个块,每个块 140 行。我们称它们为“1:2100”。我想创建一些东西,将“1”写入“~/full_path_name/A1.csv”,然后转到“2”并写入“~/full_path_name/A2.csv”,然后将“3”写入“~/full_path_name/A3.csv"等

我包含了 "~/full_path_name/",因为以后这个路径名会因使用相同代码的其他数据而改变,为了我自己的理解,我需要在代码中看到它。我不知道如何写一个我要求别人更正的小样本,因为我根本不知道怎么写。

有人可以就如何做到这一点提出建议吗?谢谢。

我才编码一个月,完全是自学成才。我没有其他编码程序的背景。除了这里,我没有人可以寻求帮助。我对术语很困惑,所以请理解我是否以正确的方式提问,如果需要我会尝试更正它。

编辑,在做一些进一步的研究后 --

这是我在@RichPaloo 的 SO 上的其他地方找到的,以及我在下面的改编:

#example data.frame
df <- data.frame(x = 1:4, y = c("a", "a", "b", "b")) 

#split into a list by the y column 
l <- split(df, df$y) 

#the names of the list are the unique values of the y column 
nam <- names(l) 

#iterate over the list and the vector of list names and write csvs
for(i in 1:length(l)) {
  write_csv(l[[i]], paste0(nam[i], ".csv"))
}

这是我的版本:

bcc4.5_WINTER <- split(bcc4.5_FinalWinterRO, f = bcc4.5_FinalWinterRO$HUC8) 

nam <- names(bcc4.5_WINTER) 

for(i in 1:length(bcc4.5_WINTER)) {
write_csv(bcc4.5_WINTER[[i]], paste0(“~/Rprojects/BCC_CSM1_1_RCP_45/Winter/”, nam[i], “.csv”))
}

我的主文件夹“/BCC_CSM1_1_RCP_45/Winter/”中的文件夹似乎有问题它在两端都显示“意外令牌”,但在“~Rprojects”处却没有。我可以不发送一些东西吗到我的主文件夹中的文件夹?

它还在“.csv”附近的引号下方显示红线。我不知道这是怎么回事,因为这正是那个人成功使用的东西,显然,在另一个 post 中。谢谢。

调查潜在的拼写错误问题

请看下面两行:

  write.csv(l[[1]], file = paste0("./a_folder/", names(l)[1], ".csv"))
  write.csv(l[[1]], file = paste0(“./a_folder/”, names(l)[1], “csv”))

第 1 行将保存文件。请注意 "./a_folder/"".csv" 被视为文本。

第 2 行 “./a_folder/”“.csv” 未被识别为文本。第 2 行产生错误:unexpected input in " write.csv(l[[1]], file = paste0(“"

RStudio 为您的代码着色以帮助您解决此问题。


关于不使用 for 循环的想法。 我认为一种更好的方法(特别是当你有大数据集时)是使用 lapplymapply。这些函数的作用是获取列表的每个“块”并对其应用一个函数。

As lapply 在处理每个块时丢失了它的名称。当您想使用块的名称来命名计算机上的文件时,这可能会很烦人。 mapply() 处理这种情况就得心应手了。

这是使用提供的示例的示例。

# example data.frame
df <- data.frame(x = 1:4, y = c("a", "a", "b", "b"))
# split df
l <- split(df, df$y)

# save each "chunk" of l as a .csv file on a hard drive

# 1st, create a function that takes a "chunk" of your list and its name as inputs

save_fun <- function(l_i, name_i) {
  print(l_i) # print the output in console
  write.csv(l_i, file = paste0("./a_folder/", name_i, ".csv")) # save the file on your computer
}
# 2nd, use mapply (and not a list) to use the previous function on each pair chunk/name 

mapply(FUN = save_fun, l_i = l, name_i = names(l), SIMPLIFY = FALSE) # see ?mapply for how to use mapply()

所以,上面的代码示例 (@Paul) 工作,除了 df[l] 没有被迭代,所以我从每个 l 实例中删除了 _i。我遇到的最后一个问题(在上面的评论中)是因为路径名不完整。

我使用 fwrite() 而不是 write.csv 因为它在我与错误作斗争时给了我更好的反馈。这给了我我需要的东西:

#split file into chunks by names within a row, in this case row "BBB"

df <- split(old_df, f = old_df$BBB)

#将这些块写入单独的 .csv 文件,名称为每个块的名称

save_fun <- function(df, name_i) {
  fwrite(df, file = paste0("~/Desktop/projects_folder/", name_i, ".csv"))
}

#将文件保存到您的计算机上

mapply(FUN = save_fun, df, name_i = names(df), SIMPLIFY = FALSE)

非常感谢保罗。