【问题标题】:Collapse / concatenate / aggregate multiple columns to a single comma separated string within each group [duplicate]折叠/连接/聚合多个列到每个组中的单个逗号分隔字符串[重复]
【发布时间】:2020-02-14 20:29:30
【问题描述】:

这是Collapse / concatenate / aggregate a column to a single comma separated string within each group的扩展

目标:根据一个分组变量聚合多个列,并通过选择的分隔符分隔各个值。

可重现的例子:

data <- data.frame(A = c(rep(111, 3), rep(222, 3)), B = c(rep(c(100), 3), rep(200,3)), C = rep(c(1,2,NA),2), D = c(15:20), E = rep(c(1,NA,NA),2))
data
    A   B  C  D  E
1 111 100  1 15  1
2 111 100  2 16 NA
3 111 100 NA 17 NA
4 222 200  1 18  1
5 222 200  2 19 NA
6 222 200 NA 20 NA

A 是分组变量,但 B 仍显示在整体结果中(B 取决于我的应用程序中的 A),C、D 和 E 是要折叠成单独的 character 字符串的变量。

期望的输出

    A   B  C    D         E
1 111 100  1,2  15,16,17  1
2 222 100  1,2  18,19,20  1    

我在 R 方面没有丰富的经验。我确实尝试扩展 G. Grothendieck 发布到链接帖子的解决方案以满足我的要求,但不能完全正确地处理多个列。

获得所需输出的正确实现是什么?

我在尝试中特别关注group_bysummarise_allaggregate。它们完全是一团糟,所以我认为展示它甚至没有帮助。

编辑: 发布的解决方案非常适合显示所需的结果! 继续为那些找到它的人提高这篇文章的价值。

用户如何选择自己的分隔符。 例如'-', '\n' @akrun 和 @tmfmnk 当前的解决方案都导致列表而不是串联的 character 字符串。如果我说错了,请纠正我。

data$D
[1] 15 16 17 18 19 20
> data$A
[1] 111 111 111 222 222 222
> data$B
[1] 100 100 100 200 200 200
> data$C
[1]  1  2 NA  1  2 NA
> data$D
[1] 15 16 17 18 19 20
> data$E
[1]  1 NA NA  1 NA NA

【问题讨论】:

  • 不确定你最后的意思,因为他们的答案似乎都给出了字符串,只是字符串中带有逗号。如果您想尝试不同的分隔符或有一些用户界面,您可以将变量作为折叠参数传递给pastestr_c。除此之外,this 或它链接到的帖子应该让你从做一个摘要列到一次做多个
  • 嗨,Camille,我试图将数据传递给 DT 的数据表。但是,每次出现仍然会导致一行,但这可能是 DT 特有的问题。我记得在某个时候看到有人发布了一个关于导出为 csv 与 pdf 及其所需格式的问题。即使它在控制台中正确输出,格式仍然不同。

标签: r aggregate


【解决方案1】:

我们可以按“A”、“B”分组,并使用summarise_atpaste所有非NA元素

library(dplyr)
data %>% 
    group_by(A, B) %>%
    summarise_at(vars(-group_cols()), ~ toString(.[!is.na(.)]))
# A tibble: 2 x 5
# Groups:   A [2]
#      A     B C     D          E    
#  <dbl> <dbl> <chr> <chr>      <chr>
#1   111   100 1, 2  15, 16, 17 1    
#2   222   200 1, 2  18, 19, 20 1   

如果我们需要传递自定义分隔符,请使用pastestr_c

library(stringr)
data %>% 
    group_by(A, B) %>%
    summarise_at(vars(-group_cols()), ~ str_c(.[!is.na(.)], collapse="_"))

或者使用base Raggregate

aggregate(. ~ A + B, data, FUN = function(x) 
      toString(x[!is.na(x)]), na.action = NULL)

【讨论】:

    【解决方案2】:

    使用dplyr,您可以:

    data %>%
     group_by(A, B) %>%
     summarise_all(~ toString(na.omit(.)))
    
          A     B C     D          E    
      <dbl> <dbl> <chr> <chr>      <chr>
    1   111   100 1, 2  15, 16, 17 1    
    2   222   200 1, 2  18, 19, 20 1 
    

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2017-04-30
      • 2018-05-08
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多