【问题标题】:Write multiple csv files by group [closed]按组写入多个csv文件[关闭]
【发布时间】:2018-03-19 02:44:29
【问题描述】:

我想按组“Rkey”将我的数据框分成多个 csv 文件。例如,下面的示例数据会生成 3 个不同的 csv 文件,每个文件对应一个唯一的 Rkey 组:R01、R02 和 R03。这三个文件中的每一个都只包含属于其各自组的行。这些文件的名称可以与 Rkey 组名称匹配。

我应该如何解决这个问题?非常感谢!

Pkey    Rkey    Var1     Var 2
R01_1   R01  0.0000861   0.0021976 
R01_2   R01  0.0157098   0.0415425 
R01_3   R01  0.0142236   0.0316527 
R01_4   R01  0.0000328   0.3496403 
R01_5   R01  0.0122406   0.1739126
R02_1   R02  0.0000856   0.0000915 
R02_2   R02  0.0002946   0.0006898 
R02_3   R02  0.0209878   0.0209901 
R02_4   R02  0.0001359   0.0008970 
R02_5   R02  0.0011158   0.0023558 
R02_10  R02  0.0015220   0.0019581 
R02_11  R02  0.0004664   0.0385724 
R02_12  R02  0.0000095   0.3224465 
R03_1   R03  0.0008863   0.0056300 
R03_2   R03  0.0000021   0.0000185 
R03_3   R03  0.0000170   0.0001655 

【问题讨论】:

    标签: r loops csv


    【解决方案1】:

    考虑by

    by(df, df$Rkey, FUN=function(i) write.csv(i, paste0(i$Rkey[1], ".csv")))
    

    【讨论】:

    • 比我的还要简单。 +1
    • 我经常对by 未被充分利用感到惊讶。
    【解决方案2】:

    一个简单的方法:

    sapply(unique(df$Rkey), function(x) 
      write.csv(df[df$Rkey==x,],paste0("~/YourPathHere/",x,".csv"),row.names=FALSE))
    

    【讨论】:

      【解决方案3】:

      这个怎么样?

      customFun  = function(DF) {
      write.csv(DF,paste0("mtcars_cyl_",unique(DF$cyl),".csv"))
      return(DF)
      }
      
      mtcars %>% 
      group_by(cyl) %>% 
      do(customFun(.))
      

      或者,这个。

      require(data.table)
      # Because this is a built in table we have to make a copy first
      mtcars <- mtcars 
      setDT(mtcars) # convert the data into a data.table
      
      mtcars[, write.csv(.SD, paste0("mtcars_cyl_", .BY, ".csv")), by = cyl]
      

      【讨论】:

        【解决方案4】:


        使用tidyverse 生态系统的一种解决方案

        使用 readr 加载数据

        library(readr)
        df <- read_delim("Pkey Rkey Var1 Var2
        R01_1 R01 0.0000861 0.0021976
        R01_2 R01 0.0157098 0.0415425
        R01_3 R01 0.0142236 0.0316527
        R01_4 R01 0.0000328 0.3496403
        R01_5 R01 0.0122406 0.1739126
        R02_1 R02 0.0000856 0.0000915
        R02_2 R02 0.0002946 0.0006898
        R02_3 R02 0.0209878 0.0209901
        R02_4 R02 0.0001359 0.0008970
        R02_5 R02 0.0011158 0.0023558
        R02_10 R02 0.0015220 0.0019581
        R02_11 R02 0.0004664 0.0385724
        R02_12 R02 0.0000095 0.3224465
        R03_1 R03 0.0008863 0.0056300
        R03_2 R03 0.0000021 0.0000185
        R03_3 R03 0.0000170 0.0001655", delim = " ")
        

        使用tidyr 按组嵌套数据,创建可以使用的列表列。然后使用purrr 遍历data.frame 的列。 pwalk 允许您遍历列表以执行一些没有结果的功能,例如编写 CSV。 我创建了一个 tempdir 来编写一些文件。

        library(tidyr)
        library(purrr)
        temp_dir <- tempfile()
        dir.create(temp_dir)
        
        df %>%
          nest(-Rkey) %>% 
          pwalk(function(Rkey, data) write_csv(data, file.path(temp_dir, paste0(Rkey, ".csv"))))
        

        我们检查文件是否已创建

        list.files(temp_dir)
        #> [1] "R01.csv" "R02.csv" "R03.csv"
        

        它们包含一些数据

        read_lines(list.files(temp_dir, full.names = T)[1])
        #> [1] "Pkey,Var1,Var2"            "R01_1,8.61e-5,0.0021976"  
        #> [3] "R01_2,0.0157098,0.0415425" "R01_3,0.0142236,0.0316527"
        #> [5] "R01_4,3.28e-5,0.3496403"   "R01_5,0.0122406,0.1739126"
        

        我们只是删除了我们创建的临时文件夹

        unlink(temp_dir, recursive = T)
        

        【讨论】:

          【解决方案5】:

          您可能想要使用子集功能。

           subset(dataframe_name, Rkey=val)
          

          要获取唯一值列表,请使用 RKey 列上的“唯一”函数,您可以通过以下方式选择:

          dataframe_name[2]
          

          现在您只需获取每个子集,然后对它做任何您想做的事情 :)

          您的最终代码应如下所示:

          unique_rkeys = unique(dataframe_name[2])
          for(key in unique_keys){
              df_subset = subset(dataframe_name, Rkey=key)
              //do stuff with the subset...
          }
          

          【讨论】:

            猜你喜欢
            • 2013-03-13
            • 2016-09-05
            • 1970-01-01
            • 1970-01-01
            • 2016-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            相关资源
            最近更新 更多