【问题标题】:Group by multiple columns and write each group into csv [duplicate]按多列分组并将每个组写入csv [重复]
【发布时间】:2017-09-25 19:28:18
【问题描述】:
BRAND ID    FIRST_NAME  CITY
6     1167  Sara        Sarasota
6     1167  Jeffrey     Sarasota
6     1167  Shane       Sarasota
8     1167  Paul        Lakewood Ranch
6     10931 Carol       Grosse Pointe
6     10931 Nick        Detroit
8     10931 William     Grosse Pointe Farms
6     4935  Debra       Lacoochee
6     4935  Mark        Zephyr hills
6     4935  Michael     Zephyr hills

我有一个类似于上表的 .csv 文件,其中包含我需要拆分为多个 .csv 文件的客户信息。

每个文件都需要按品牌和 ID 进行拆分。在上面的示例中,将有 2 个 .csv 文件,其中 (Brand = 6, ID = 1167) 有 3 条客户记录,而 (Brand = 8, ID = 1167) 有 1 条客户记录。

我需要一些可以检测每个唯一 ID 的代码的帮助,因为我的数据文件中有 30 个不同的 ID。

【问题讨论】:

  • @zx8754 只是一点,OP 询问关于分组和写入 csv(对每个组应用函数)的问题,而链接的帖子正在给出如何制作 dfs 列表并在其上应用函数的答案该列表的每个元素。与我所拥有的相比,效率有点低,你不这么认为吗?
  • @Masoud 没有反对您的回答。如果一个人了解 R 的基础知识,这是一项非常简单的任务,不需要额外的包。此外,帖子吸引了不好的答案,因此我关闭为重复。链接的帖子应该有助于开始使用该帖子。如果不同意,请随时投票重新开放。

标签: r


【解决方案1】:

使用data.table 包我们可以使用以下内容:

按一列分组:

library(data.table)
setDT(mydat)[, write.csv(c(.BY,.SD), paste0("BRAND_ID_", .BY, ".csv")), by=BRAND]

按两(或更多)列分组:

对于多个列,我可以考虑添加一个帮助列,它是用于分组的所需列的组合:

library(data.table)
setDT(mydat)[, tempcol:=paste(ID,BRAND,sep="_")]
setDT(mydat)[, write.csv(.SD, paste0("ID_BRAND_", .BY, ".csv")),by=tempcol]

这为每个 ID 和品牌的唯一组合提供了 5 个文件。它们将被保存到当前工作目录。如果您想将输出放在所需的目录中,请阅读 ?write.csv

数据

read.table(text='BRAND ID    FIRST_NAME  CITY
                6     1167  Sara        Sarasota
                6     1167  Jeffrey     Sarasota
                6     1167  Shane       Sarasota
                8     1167  Paul        Lakewood_Ranch    
                6     10931 Carol       Grosse_Pointe
                6     10931 Nick        Detroit
                8     10931 William     Grosse_Pointe_Farms
                6     4935  Debra       Lacoochee
                6     4935  Mark        Zephyr_hills
                6     4935  Michael     Zephyr_hills', header=T, quote="") -> mydat

【讨论】:

  • 感谢您的帮助。我尝试了您的代码,但收到此错误文件中的错误(文件,ifelse(追加,“a”,“w”)):无效的'description'参数另外:警告消息:在if(file ==“”)文件中 1 并且只使用第一个元素
  • @lomingchun 该错误说明您误用了?file 的description= 参数。另外,我猜你不需要stdout(),除非你正在做一些非常奇特的事情。
  • 需要对您提供的代码进行哪些更改以修复错误?如果您需要有关我在做什么的更多信息,我很乐意提供。感谢您迄今为止的帮助。
  • @lomingchun 这就是我如何命名输出文件的问题。当我们仅按一列分组但不适用于多列分组时,使用.BY 作为名称。您是否需要每个文件的解释性名称,或者如果它们以file_1.csvfile_2.csv 等形式出现也可以?
  • 文件名应该有ID和品牌。 "1167_6.csv"
猜你喜欢
  • 2018-05-13
  • 2016-07-25
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2018-03-19
  • 2017-02-08
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多