如何在 R 中对相似的行进行分组

How to group similar rows in R

我有一个table如下:

   Rptname     Score

    Bebo23        8
    Bebo22        9
    Bebo19        10
    Alt88         12
    Alt67         11
    Jimm          5
    Jimm2         7

等 我想将那些相似的行归为一组。即

     Bebo         27
     Alt          22
     Jimm         12

行名的开头始终是分组依据的相似部分,但相似字符的数量可能会有所不同。我明白我将不得不定义组并且可能使用某种正则表达式,但我不确定如何在此基础上进行分组和求和。预先感谢您的帮助

您可以使用 sub 去除末尾的数字并执行 aggregate

do.call(`data.frame`, aggregate(Score~cbind(Rptname=sub('\d+$', '', 
                        Rptname)), df, sum))
#    Rptname Score
#1     Alt    23
#2    Bebo    27
#3    Jimm    12

或将 transformaggregate 一起使用(如@docendo discimus 所建议)

aggregate(Score ~ Rptname, transform(df, Rptname = sub("\d+$", 
                        "", Rptname)), sum)

或带有 data.table

的选项
library(data.table)
 setDT(df)[, .(Score=sum(Score)),
           by=list(Rptname=sub('\d+$','', Rptname))]

或使用rowsum(@alexis_laz

建议
with(df, rowsum(Score, sub('\d+$', '', Rptname)))
#     [,1]
#Alt    23
#Bebo   27
#Jimm   12

更新

如果分组是基于前三个字符,您可以使用substr

aggregate(Score~Rptname, transform(df, Rptname=substr(Rptname, 1,3)), sum)
#   Rptname Score
#1     Alt    23
#2     Beb    27
#3     Jim    12

使用 dplyr:

library(dplyr)
DF %>% group_by(Rptname = sub("\d+$", "", Rptname)) %>% summarise(Score = sum(Score))
#Source: local data frame [3 x 2]
#
#  Rptname Score
#1     Alt    23
#2    Bebo    27
#3    Jimm    12

更新:

如果想按"Rptname"中的前三个字母分组,可以在dplyr中使用如下代码:

DF %>% group_by(Rptname = substr(Rptname, 1, 3)) %>% summarise(Score = sum(Score))
#Source: local data frame [3 x 2]
#
#  Rptname Score
#1     Alt    23
#2     Beb    27
#3     Jim    12