【问题标题】:Collapse text by group in data frame [duplicate]在数据框中按组折叠文本[重复]
【发布时间】:2014-05-10 11:38:25
【问题描述】:

如何在group 列中按组聚合数据并折叠text 列中的文本?

样本数据:

df <- read.table(header=T, text="
group text
a a1
a a2
a a3
b b1
b b2
c c1
c c2
c c3
")

所需的输出(数据框):

group text
a     a1a2a3
b     b1b2
c     c1c2c3

现在我有:

sapply(unique(df$group), function(x) {
  paste0(df[df$group==x,"text"], collapse='')
})

这在某种程度上有效,因为它返回按组正确折叠的文本,但作为向量:

[1] "a1a2a3" "b1b2"   "c1c2c3"

我需要一个带有group 列的数据框。

【问题讨论】:

    标签: r


    【解决方案1】:

    只需使用aggregate

    aggregate(df$text, list(df$group), paste, collapse="")
    ##   Group.1      x
    ## 1       a a1a2a3
    ## 2       b   b1b2
    ## 3       c c1c2c3
    

    plyr

    library(plyr)
    ddply(df, .(group), summarize, text=paste(text, collapse=""))
    ##   group   text
    ## 1     a a1a2a3
    ## 2     b   b1b2
    ## 3     c c1c2c3
    

    如果您有大型数据集,ddplyaggregate 快。

    编辑: 在@SeDur 的建议下:

    aggregate(text ~ group, data = df, FUN = paste, collapse = "")
    ##   group   text
    ## 1     a a1a2a3
    ## 2     b   b1b2
    ## 3     c c1c2c3
    

    对于与早期方法相同的结果,您必须这样做:

    aggregate(x=list(text=df$text), by=list(group=df$group), paste, collapse="")
    

    EDIT2:使用data.table

    library("data.table")
    dt <- as.data.table(df)
    dt[, list(text = paste(text, collapse="")), by = group]
    ##    group   text
    ## 1:     a a1a2a3
    ## 2:     b   b1b2
    ## 3:     c c1c2c3
    

    【讨论】:

    • 使用aggregate的公式形式给出更漂亮的名称:aggregate(text ~ group, data = df, FUN = paste, collapse = "")
    • @rawr 这是第一次编辑
    • 非公式 aggregate 也不需要那么折磨人 - aggregate(df["text"], df["group"], paste, collapse="") 就可以了。
    【解决方案2】:

    您可以为此使用 dplyr 包

    library(dplyr)
    
    df %>%
      group_by(group) %>%
      summarise(text=paste(text,collapse=''))
    

    【讨论】:

    • 当您折叠所有行时,如何保留所有变量值,而不仅仅是一个分配的值?
    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 2019-11-21
    • 2015-03-12
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多