按行拆分数据框并保存为csv

时间:2018-02-15 14:52:49

标签: r csv dataframe

我只有一个数据框,想要按行拆分数据帧,将几个新数据帧分配给新变量并将它们保存为csv文件。

a <- rep(1:5,each=3)
b <-rep(1:3,each=5) 
c <- data.frame(a,b)
#  a b
1  1 1
2  1 1
3  1 1
4  2 1
5  2 1
6  2 2
7  3 2
8  3 2
9  3 2
10 4 2
11 4 3
12 4 3
13 5 3
14 5 3
15 5 3

我想按列a拆分c。即列中的所有行都是1,从c中拆分并将其分配给A并将A保存为A.csv。 B.csv与a列中的所有2相同。 我能做的是

 A<-c[c$a%in%1,]
 write.csv (A, "A.csv")
 B<-c[c$a%in%2,]
 write.csv (B, "B.csv") 
 ...

如果我有1000行并且会有很多子集,我只是想知道是否有一种简单的方法可以通过使用for循环来实现这一点?

2 个答案:

答案 0 :(得分:2)

split()函数对于拆分数据框非常有用。此外,您可以在此处使用lapply() - 它应该比循环更有效。

dfs <- split(c, c$a) # list of dfs
# use numbers as file names
lapply(names(dfs),
       function(x){write.csv(dfs[[x]], paste0(x,".csv"),
                             row.names = FALSE)}) 
# or use letters (max 26!) as file names
names(dfs) <- LETTERS[1:length(dfs)]
lapply(names(dfs),
       function(x){write.csv(dfs[[x]],
                             file = paste0(x,".csv"),
                             row.names = FALSE)})

答案 1 :(得分:1)

for(i in seq_along(unique(c$a))){
  write.csv(c[c$a == i,], paste0(LETTERS[i], ".csv"))}

但是,如果您有超过26个子集,则应该考虑会发生什么。这些文件的名称是什么?