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