【发布时间】:2018-09-05 19:38:27
【问题描述】:
我正在尝试拆分数据帧并使用一个变量中的唯一值将其写入 r 中的 csv 文件。我是 r 的新手,我不完全确定我知道自己在做什么。
## trying to subset data
library(dplyr)
library(plyr)
#set the working directory
setwd("S:/some stuff")
## load the datafile into an object called data.
data <- read.csv("S:/some stuff/Area.csv",
header = TRUE, sep = ",")
#Create subsets of data by LA
LA<-subset(data,AREA == "LA")
我的数据框有 2,500 个观察值和 20 个变量。
我的数据框称为 LA 我想将其拆分的变量称为疾病
我找到了这个How to create multiple ,csv files in R?
并相应地重新分配它
来自
plyr::d_ply(iris, .(Species), function(x) write.csv(x,
file = paste(x$Species, ".csv", sep = "")))
到
plyr::d_ply(LA, .(Disease), function(x) write.csv(x,
file = paste(LA$Disease, ".csv", )))
但是....
Error in file(file, ifelse(append, "a", "w")) :
invalid 'description' argument
In addition: Warning message:
In if (file == "") file <- stdout() else if (is.character(file)) { :
Show Traceback
Rerun with Debug
Error in file(file, ifelse(append, "a", "w")) :
invalid 'description' argument
我想解决两件事。 1)子集数据框 2) 写入路径
理想情况下,我想从导入数据(Area.csv 文件)中循环遍历它。 这有区域和疾病。有12个地区和20种疾病。 我想按区域创建每种疾病的 csv 文件。 在本例中,面积 = LA,然后是疾病。
如何使用循环逐步为每个区域创建 20 个不同的文件?
mpExpenses2012 = read.csv("~/Downloads/DataDownload_2012.csv")
#mpExpenses2012 is the large dataframe containing data for each MP
#Get the list of unique MP names
for (name in levels(mpExpenses2012$MP.s.Name)){
#Subset the data by MP
tmp=subset(mpExpenses2012,MP.s.Name==name)
#Create a new filename for each MP - the folder 'mpExpenses2012' should already exist
fn=paste('mpExpenses2012/',gsub(' ','',name),sep='')
#Save the CSV file containing separate expenses data for each MP
write.csv(tmp,fn,row.names=FALSE)
}
可能会有所帮助,但它写的是一条让我失望的道路。
编辑
library(tidyr)
library(purrr)
temp_dir <- tempfile()
dir.create(temp_dir)
LA %>%
nest(-FinalDiseaseForMonthlyAnalysis) %>%
pwalk(function(FinalDiseaseForMonthlyAnalysis, data) write.csv(data, file.path(temp_dir, paste0(FinalDiseaseForMonthlyAnalysis, ".csv"))))
list.files(temp_dir)
temp_dir
unlink(temp_dir, recursive = T)
这行得通。但现在是“文件在哪里?”题。 是的:我得到临时文件,然后取消链接。 但是如何保存在 S:/some stuff/ 上的文件夹中
?
最终编辑:已解决 我读过 r 中的所有内容都是一个列表。我找到了一种分成两列来做我需要的方法。令人讨厌的是,它在这里的 cmets 中链接: https://blog.ouseful.info/2013/04/03/splitting-a-large-csv-file-into-separate-smaller-files-based-on-values-within-a-specific-column/
我错过了。 我在使用 dir.create 生成目录时也遇到了问题。谁知道当您尝试做某事时 dir.create 需要 recursive = TRUE ?我现在就做。
无论如何。这就是我所做的:
## trying to subset data
# generate data:
library(tidyr)
library(purrr)
library(dplyr)
library(write)
## set working directory
setwd("S:/somestuff")
#create the directories - pretty sure there's a way to avoid doing this long hand
dir.create("S:/somestuff/CSV source files", recursive = TRUE)
dir.create("S:/somestuff/CSV source files/LA1", recursive = TRUE)
dir.create("S:/somestuff/CSV source files/LA2", recursive = TRUE)
dir.create("S:/somestuff/CSV source files/LA3", recursive = TRUE)
#Read in the CSV
DF = read.csv("S:/somestuff/CSV source files/ALL.csv",
header = TRUE, sep = ",")
glimpse(DF)
#This splits the dataframe generated above (DF) and calls it DF4
DF4 <- split(DF,list(DF$LA,DF$FinalDiseaseForMonthlyAnalysis))
lapply(names(DF4), function(name) write.csv(DF4[[name]], file = paste("S:/somestuff/CSV source files/",gsub('','',name),sep = ''), row.names = F))
我猜如果我读入数据帧,我可以使用 dir.create 从数据帧中的 LA 名称创建路径。
回到问题后。在最新版本的 dplyr 中更容易
ourdata<-DF4%>%
group_by(DF$LA,DF$FinalDiseaseForMonthlyAnalysis)%>%
group_walk(~ write_csv(.x, paste0(.y$LA,.y$FinalDiseaseForMonthlyAnalysis, ".csv")))
【问题讨论】:
-
我同意这可能是关于分裂的评论,但这是写作......
-
cderv 在链接问题中的回答解决了写入文件的问题。特定的行是
pwalk(function(Rkey, data) write_csv(data, file.path(temp_dir, paste0(Rkey, ".csv")))) -
好的。让我看看,如果有效,我会将其标记为已解决?
-
看起来可行,但我对 tempdir 等有疑问。