如何合并与grep模式匹配的特定行

时间:2015-04-06 17:51:09

标签: r

我的数据框如下:

Jen    Rptname   freq

 AKT      bilb1      23
 AKT      bilb1      234
 DFF      bilb22     987
 DFF      bilf34     7
 DFF      jhs23      623
 AKT      j45        53
 JFG      jhs98      65

我知道如何根据各列对整个数据框进行分组,但如何根据grep合并各个行(在本例中为bilb。*和jhs。*)

我希望能够合并行(因此也将频率加在一起)和bilb *并分别用jhs *合并行,以便我最终得到

   AKT      bilb       257
   DFF      bilb      987
   DFF      bilf34     7
   DFF      jhs       623
   AKT      j45        53
   JFG      jhs      65

这是聚合是由Jen和Rptname进行的,所以我可以看到每个Jen中有多少个相同的Rptnames

2 个答案:

答案 0 :(得分:4)

我们可以使用grep来获取具有'bilb'或'jhs'的'Rptname'元素的索引,使用sub删除数字部分并使用aggregate来获取{'1}''Freq'by'Rptname'

sum

更新

假设您的数据集是'df2'

indx <- grep('bilb|jhs', df1$Rptname)
df1$Rptname[indx] <- sub('\\d+', '', df1$Rptname[indx])
aggregate(freq~Rptname, df1, FUN=sum)
#   Rptname freq
#1    bilb 1244
#2  bilf34    7
#3     j45   53
#4     jhs  688

数据

 df2$grp <- gsub("([A-Z]+|[a-z]+)[^A-Z]+", "\\1", df2$Rptname)
 aggregate(freq~grp+Jen, df2, FUN=sum)

答案 1 :(得分:4)

与akrun相似,我喜欢他使用aggregate比创建中间向量更好:

> inter <- tapply(dat$freq, sub("^(bilb|jhs)(.+)$", "\\1", dat$Rptname) ,sum)
> final <- data.frame( nams = names(inter), sums = inter)
> final
         nams sums
bilb     bilb 1244
bilf34 bilf34    7
j45       j45   53
jhs       jhs  688

我的模式需要&#39; bilb&#39; amd&#39; jhs&#39;处于价值的开头。如果不是,请移除"^",但如果是,请添加"(.*)"并切换到替换中的"\\2"