用R

时间:2016-02-22 06:21:19

标签: r dplyr

我有一组像这样的数据

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.mutantskilled的计数前一对。同样,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))
)

但我不知道如何做独特的部分,第二部分。

1 个答案:

答案 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