给定以下示例数据(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时从框架中删除Grp
和Subgrp
列。(如果不是这样,那么用下面的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))