R:在组和子组(通过目录和CSV)中切片数据帧记录的最有效方法

  • 本文关键字:数据帧 切片 记录 方法 有效 CSV r
  • 更新时间 :
  • 英文 :


给定以下示例数据(R data frame),我想为每个组创建文件夹,其中包含每个子组的文件夹,(最后)包含具有相应值val1的CSV文件,使用r。

Grp <- c("A", "A", "A", "B", "B", "B")
Subgrp <- c("k", "l", "m", "n", "n", "n")
val1 <- c(1.1, 3.2, 4.5, 5.6, 6.7, 7.7)
df <- data.frame(Grp, Subgrp, val1)

这是我到目前为止所尝试的,为每个子组创建一个CSV文件。

by(df, df$Subgrp, FUN=function(i) write.csv(i,paste0("C:/Temp/",i$Subgrp[1], ".csv")))

我需要迭代这个大数据帧。实现这一目标的最有效方法是什么?我愿意听取基于循环和dpyr的建议。

你很接近了。

我的解释:

  • "为每个组创建文件夹,包含每个子组的文件夹">:使用.../A/k.../B/n目录
  • "具有相应值的CSV文件val1">:在保存为CSV时从框架中删除GrpSubgrp列。(如果不是这样,那么用下面的i替换subset(...)。)
basepath <- "c:/Temp"
# pre-create directories
for (p in unique(file.path(basepath, df$Grp, df$Subgrp))) dir.create(p, recursive = TRUE)
by(df, df$Subgrp, FUN=function(i) {
write.csv(subset(i, select = -c(Grp, Subgrp)),
file.path(basepath, i$Grp[1], i$Subgrp[1], "value.csv"),
row.names = FALSE)
})
# df$Subgrp: k
# NULL
# ------------------------------------------------------------ 
# df$Subgrp: l
# NULL
# ------------------------------------------------------------ 
# df$Subgrp: m
# NULL
# ------------------------------------------------------------ 
# df$Subgrp: n
# NULL
lf <- list.files(".", pattern = "csv$", recursive = TRUE, full.names = TRUE)
lf
# [1] "./A/k/value.csv" "./A/l/value.csv" "./A/m/value.csv" "./B/n/value.csv"
read.csv(lf[1])
#   val1
# 1  1.1

由于by的返回值无关紧要,您可以将其包装在invisible(.)中,或者捕获并忽略输出ign <- by(..)

我宁愿使用lapply,这样您可以方便地使用子组的名称。

lapply(df$Subgrp, (x) write.csv(subset(df, Subgrp == x), file=sprintf('C:/Temp/%s.csv', x)))

使用

df %>%
unite(file, Grp, Subgrp, sep='/')%>%
group_by(file = paste0(file, '.csv'))%>%
summarise(write.csv(cur_data(), 
if(dir.exists(dirname(file[1]))) file[1]
else {dir.create(dirname(file[1]),recursive = T);file[1]},row.names = FALSE))

最新更新