【问题标题】:Aggregate unique values from multiple columns in R聚合 R 中多列的唯一值
【发布时间】:2019-10-02 22:26:54
【问题描述】:

我需要导入一个 csv,并且在任何情况下,如果行包含所有相同的数据,除了列 p 和 q,必须合并这些行并在 p 和 q 的值之间加上下划线。问题是大约有 40 列要分组。我正在尝试 R,因为文件大小可能很大,并且使用类似 powershell 的东西需要很长时间才能分组。除了这两列之外,我尝试的代码似乎可以处理 5 行和 1 个重复,但是更大的数据集未能产生我想要的结果。

例如...我在下面的示例和我的代码示例中删除了很多列,但希望您能明白:

a, b, c, d, p,q
ab,1,no,id,ad,43  
ab,3,zq,id,7a,23
ac,4,as,79,8d,2s
ad,3,zq,id,86,25
ac,3,zq,id,7a,af
b4,7,as,93,zz,aw
b4,7,as,93,32,al

需要像:

 a,b, c, d, p,q
ab,1,no,id,ad,43  
ab,3,zq,id,7a,23
ac,4,as,79,8d,2s
ad,3,zq,id,86_7a,25_af
b4,7,as,93,zz_32,aw_al

以下是我尝试使用“dat”作为数据框的内容,但它看起来很混乱,结果似乎扭曲了输出 CSV 的格式。 q 和 p 位于文件末尾,将包含数据行中的行,而不是聚合列信息。

 dat <- read.csv(file ="Sample.csv", header= TRUE)
 library(dplyr)
 result <- dat %>%
 group_by(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,r,x,w,y,z,aa,bb,cc,dd,ee) %>% 
 summarise(p = paste(p, collapse = "_"),q = paste(q, collapse = "_")) %>%
 ungroup()
 write.csv(result, "test.csv",row.names=FALSE)

仅供参考-这是我第一次使用 R。

【问题讨论】:

  • 不清楚您的代码为什么不起作用。你需要summarise_at(vars(p, q), paste, collapse="_")
  • 我认为您应该使用read.csv 阅读此内容。使用这种方式可能更容易。
  • 对不起,我确实 read.csv 并写了,只是没有包括那部分。修改了代码。
  • @akrun ,我可能已经解决了格式问题。我开始认为我所做的确实有效,但是我的 .csv 文件有时包含双引号作为值。当我再次编写 csv 时,它会在该双引号之后使用任何内容并创建一个子行......试图弄清楚如何解决这个问题。
  • 不确定是不是写入数据的结果。当你写数据时,试试write.csv(..., quote = FALSE)。如果你有双引号,那么dat %&gt;% mutate_if(is.character, str_remove, '"') %&gt;%

标签: r concatenation grouping aggregation large-data


【解决方案1】:

如果列是character,一个选项是删除双引号,然后执行group_by paste

library(tidyverse)
nm1 <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", 
      "m", "n", "o", "r", "x", "w", "y", "z", "aa", "bb", "cc", "dd", 
       "ee")
dat %>% 
   mutate_if(is.character, str_remove, '"') %>%
   group_by_at(vars(nm1)) %>%
   summarise_at(vars(p, q), list(~ paste(unique(.), collapse="_")))

【讨论】:

  • 这也有帮助。我现在遇到的问题是每个数据都用双引号括起来并用逗号分隔:"a","b","c" 有时输入数据看起来像这样:" ,ab","f"ss ",而且似乎把我的输出扔掉了。
  • @user481211 在这种情况下,您还可以将separate_rowssep="," 一起使用。没有一个可重复的小例子,很难评论
  • 编辑了我的评论,在我完成示例之前不小心按了 Enter。
  • @user481211 你能用dput 的一个小例子更新你的帖子,这样我就更容易理解你的结构了
  • 我最终将输入文件的分隔符更改为管道以解决我遇到的问题。现在似乎可以工作了,唯一的问题是大型数据集仍然需要很长时间才能完成,尽管时间大约是 powershell 的一半。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2020-09-10
  • 2019-06-05
相关资源
最近更新 更多