将数据框按行拆分并保存为CSV。

3

我有一个数据框,想要按行拆分数据框,将几个新的数据框分配给新变量并保存为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分割。即所有列a中为1的行都从c中拆分出来并分配给A,然后将A保存为A.csv。对于所有列a中为2的行,也同样处理生成B.csv文件。 我可以执行以下操作:

 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个回答

3

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

谢谢您的回答。那么,如果我想用列a中的内容来命名子集,我该怎么做呢?我的意思是,“1”<-c[c$a%in%1,],然后写入csv文件(“1”,“1.csv”)。 - Rui Z.
我认为这段代码的第一部分是使用数字作为文件名。不是吗? - nghauran

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

然而,您需要考虑如果有超过26个子集会发生什么。这些文件将被命名为什么?


非常感谢您的帮助!好问题,我没有考虑到我们只有26个英文字母,我会在我的工作中避免这种情况。 - Rui Z.
很高兴听到这个消息。如果它有效,请给答案投票。 - David Klotz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接