我有一张表如下:
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)
行名称的开头始终是与组相似的部分,但相似的字符数可能会有所不同.我很欣赏我必须定义组并可能使用某种正则表达式,但我不确定如何在此基础上进行分组和求和.感谢您的帮助
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)
或者使用transform(aggregate按照@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)