聚合来自R中多个列的唯一值

时间:2019-05-15 17:48:53

标签: r concatenation grouping aggregation large-data

我需要导入一个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。

1 个答案:

答案 0 :(得分: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="_")))