【问题标题】:R Plyr Write CSVR Plyr 写入 CSV
【发布时间】: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 个不同的文件?

我是这么想的: https://blog.ouseful.info/2013/04/03/splitting-a-large-csv-file-into-separate-smaller-files-based-on-values-within-a-specific-column/

    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 等有疑问。

标签: r loops csv


【解决方案1】:

回到问题后。在最新版本的 dplyr 中更容易

DF4%>%
      group_by(DF$LA,DF$FinalDiseaseForMonthlyAnalysis)%>%
      group_walk(~ write_csv(.x, paste0(.y$LA,.y$FinalDiseaseForMonthlyAnalysis, ".csv")))

【讨论】:

    【解决方案2】:

    这对我真的很有帮助!谢谢!!我试图简化问题的症结。

    library(tidyverse)
    library(reprex)
    
    states4 <- tribble(~state,~name,~area,
          "AL","Alabama",50645.3242,
          "AZ","Arizona",113594.0781,
          "AR","Arkansas",52035.4727,
          "CA","California",155779.2031
        )
    
    chain4 <- states4 %>% split(.$state)
    
    map(names(chain4),function(stateabbrev){write_csv(chain4[[stateabbrev]],paste0("~/Downloads/","testtoken_",stateabbrev,".csv"))})
    #> [[1]]
    #> # A tibble: 1 x 3
    #>   state name      area
    #>   <chr> <chr>    <dbl>
    #> 1 AL    Alabama 50645.
    #> 
    #> [[2]]
    #> # A tibble: 1 x 3
    #>   state name       area
    #>   <chr> <chr>     <dbl>
    #> 1 AR    Arkansas 52035.
    #> 
    #> [[3]]
    #> # A tibble: 1 x 3
    #>   state name       area
    #>   <chr> <chr>     <dbl>
    #> 1 AZ    Arizona 113594.
    #> 
    #> [[4]]
    #> # A tibble: 1 x 3
    #>   state name          area
    #>   <chr> <chr>        <dbl>
    #> 1 CA    California 155779.
    
    list.files(path="~/Downloads", pattern = "testtoken.*csv")
    #> [1] "testtoken_AL.csv" "testtoken_AR.csv" "testtoken_AZ.csv"
    #> [4] "testtoken_CA.csv"
    
    reprex()
    

    reprex package (v0.3.0) 于 2019 年 10 月 2 日创建

    【讨论】:

    • 很高兴它对您有用!您的解决方案看起来非常简洁!
    • 谢谢!尽管它没有您需要的目录,但它的代码行很少:-)。在这种情况下,我认为 purr::map 与 lapply 基本相同。
    • 另选:返回问题后。在最新版本的 dplyr DF4%&gt;% group_by(DF$LA,DF$FinalDiseaseForMonthlyAnalysis)%&gt;% group_walk(~ write_csv(.x, paste0(.y$LA,.y$FinalDiseaseForMonthlyAnalysis, ".csv"))) 中更容易
    【解决方案3】:

    最后我用了:

    ## trying to subset data
    # generate data:
    library(tidyr)
    library(purrr)
    library(dplyr)
    library(stringr)
    library(plyr)
    library (car)
    ## set working directory
    setwd("S:/Somestuff/Borough profile maps/Working")
    
    ## read data in from geocoded file
    geocoded<-read.csv("geocoded 2015 - 2018.csv",na.strings=c(""," ","N/A"))
    
    str(geocoded)
    str(geocoded$GENDER)
    levels(geocoded$LA)
    
    #split geocoded data by LA 
    x <-split(geocoded,geocoded$LA)
    str(x)
    
    #Split geocoded data by LA and Final
    #split(x, f, drop = FALSE, sep = ".", lex.order = FALSE, .)
    y<-split(geocoded,list(geocoded$Final,geocoded$LA), drop = TRUE, sep = "_")
    str(y)
    
    #create dir and then write CSV files of geocoded to file locations
    dir.create("S:/Somestuff/Borough profile maps/Working/TEST/",, recursive = TRUE)
    dir.create("S:/Somestuff/Borough profile maps/Working/TEST/TEST2",, recursive = TRUE)
    lapply(names(x), function(name) write.csv(x[[name]], file = paste('S:/Somestuff/Borough profile maps/Working/TEST/',gsub(' ','',name),sep = ''), row.names = F))
    lapply(names(y),function(name) write.csv(y[[name]], file = paste('S:/Somestuff/Borough profile maps/Working/TEST/TEST2/',name,".csv")))
    

    问题在于,在我的原始代码中,您会注意到我使用的是 read.csv 但在 .txt 文件中输入。我将文件更改为 .csv 和 BANG。有效。第一次。

    我意识到你并不需要我一开始调用的所有库,但它们在我荒谬的尝试中留下了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-30
      • 2012-04-08
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多