2017-10-07 107 views
0

我想通過組「Rkey」將我的數據幀分成多個csv文件。例如,下面的示例數據會生成3個不同的csv文件,每個獨立的Rkey組有一個:R01,R02和R03。三個文件中的每一個只包含屬於其各自組的行。這些文件的名稱可以匹配Rkey組名。按組寫入多個csv文件

我該如何解決這個問題?非常感謝!

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

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

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


一種解決方案使用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 = " ") 

通過創建一個列表colunm你可以玩組使用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) 
0

如何temp文件夾這個?

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] 
0

一個簡單的方法:

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

考慮by

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

甚至比我的更簡單。 +1 – www

+0

我常常驚訝'by by'的使用不足。 – Parfait