我有一组像这样的数据
project,file,line,mutant,killstatus,commitid,isbug
p1,f1,100,NMC,killed,abc123,yes
p1,f1,100,VMC,alive,abc123,yes
p1,f1,200,NVM,alive,ab12de,no
p1,f1,200,NVM,alive,abcde1,yes
p1,f1,200,NVM,alive,abcde2,yes
我想按项目,文件,行分组并将其汇总为
project,file,line,total.mutants,killed.mutants,total.commits,bugfix.commits
p1,f1,100,2,1,1,1
p1,f1,200,1,0,3,2
也就是说,对于每个project,file,line
组合,total.mutants
的长度是(mutant,killstatus)
的唯一计数,killed.mutants
是killed
的计数前一对。同样,total.commits
是(commitid,isbug)
的唯一计数,bugfix.commits
是前一对中yes
的计数。
澄清:
对于p1,f1,100
,有两个独特的突变体,killstatus对(NMC,killed),(VMC,alive)
,其中一个被杀死。因此总共被2,1
杀死了
对于p1,f1,200
,只有一个独特的突变体,即活着的killstatus对(NVM,alive)
。因此,总共1,0
被杀害
对于p1,f1,100
,有一个唯一的commitid,isbug对(abc123,yes)
这是一个错误。因此1,1
总计,错误修正
对于p1,f1,200
,有三个唯一的commitid,isbug对(ab12de,no),(abcde1,yes),(abcde2,yes)
,其中两个是错误。因此3,2
总计,错误修正
我可以使用dplyr一次性总结它吗?我设法做了第一部分像
data %>% group_by(project,file,line) %>% summarize(
total.mutants = length(killstatus),
killed.mutants = sum(ifelse(killstatus == 'alive', F, T))
)
但我不知道如何做独特的部分,第二部分。
答案 0 :(得分:1)
我们可以尝试
library(dplyr)
library(data.table)
df1 %>%
group_by(project,file,line) %>%
transmute(temp1 = paste(mutant, killstatus),
total.mutants= uniqueN(temp1),
killed.mutants= uniqueN(paste(mutant[killstatus=='killed'],
killstatus[killstatus=='killed'])),
temp2=paste(commitid, isbug),
total.commits= uniqueN(temp2),
bug.commits= uniqueN(paste(commitid[isbug=="yes"],
isbug[isbug=="yes"])) ) %>%
distinct(., project, file, line) %>%
select(-temp1, -temp2)
# project file line total.mutants killed.mutants total.commits bug.commits
# (chr) (chr) (int) (int) (int) (int) (int)
#1 p1 f1 100 2 1 1 1
#2 p1 f1 200 1 0 3 2
或来自unite
tidyr
稍微紧凑的版本
library(tidyr)
df1 %>%
unite(temp1,mutant, killstatus) %>%
unite(temp2, commitid, isbug) %>%
group_by(project, file, line) %>%
summarise(total.mutants= n_distinct(temp1),
killed.mutants= uniqueN(temp1[grepl("killed", temp1)]),
total.commits= n_distinct(temp2),
bug.commits= uniqueN(temp2[grepl("yes", temp2)]))
# project file line total.mutants killed.mutants total.commits bug.commits
# (chr) (chr) (int) (int) (int) (int) (int)
#1 p1 f1 100 2 1 1 1
#2 p1 f1 200 1 0 3 2