按组

时间:2017-10-07 12:38:16

标签: r loops csv

我想通过组“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 

5 个答案:

答案 0 :(得分:1)


使用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按组嵌套数据,创建可以使用的列表colunm。然后使用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)

答案 1 :(得分:1)

考虑index.html

by

答案 2 :(得分:0)

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

 subset(dataframe_name, Rkey=val)

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

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...
}

答案 3 :(得分:0)

这个怎么样?

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 :(得分:0)

一种简单的方法:

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