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

Seb*_*eki 6 grouping r

我有一张表如下:

   Rptname     Score

    Bebo23        8
    Bebo22        9
    Bebo19        10
    Alt88         12
    Alt67         11
    Jimm          5
    Jimm2         7
Run Code Online (Sandbox Code Playgroud)

我想将那些相似的行汇总到一组.即

     Bebo         27
     Alt          22
     Jimm         12
Run Code Online (Sandbox Code Playgroud)

行名称的开头始终是与组相似的部分,但相似的字符数可能会有所不同.我很欣赏我必须定义组并可能使用某种正则表达式,但我不确定如何在此基础上进行分组和求和.感谢您的帮助

akr*_*run 4

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
Run Code Online (Sandbox Code Playgroud)

或者使用transformaggregate按照@docendo discimus的建议)

aggregate(Score ~ Rptname, transform(df, Rptname = sub("\\d+$", 
                        "", Rptname)), sum)
Run Code Online (Sandbox Code Playgroud)

或者一个选项data.table

library(data.table)
 setDT(df)[, .(Score=sum(Score)),
           by=list(Rptname=sub('\\d+$','', Rptname))]
Run Code Online (Sandbox Code Playgroud)

或使用rowsum (@alexis_laz 建议

with(df, rowsum(Score, sub('\\d+$', '', Rptname)))
#     [,1]
#Alt    23
#Bebo   27
#Jimm   12
Run Code Online (Sandbox Code Playgroud)

更新

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

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