我的数据框如下:
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
答案 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"
。