如何在 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
或将 transform
与 aggregate
一起使用(如@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
我有一个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
或将 transform
与 aggregate
一起使用(如@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