2017-02-23 108 views
0

注:我很新。 我中的R从R中的两列计算精度,创建汇总表

INDIVIDUALS CURRENT INFERRED 
pop1_1 1 1 
pop1_2 1 1 
pop1_3 1 2 
pop2_1 2 3 
pop2_2 2 2 
pop2_3 2 2 
pop3_1 3 1 
pop3_2 3 2 
pop3_3 3 3 

示出了由类(弹出)标记的独特的个体,类它们实际上属于在(CURRENT)和类的数据帧(DF),以将它们放置在由一个算法(INFERRED)。

我想要的是精度的总结,无论是按班级还是整体。因此,与上面的例子中,我喜欢的东西,看起来像:

POP CORRECT ACCURACY 
pop1 2 66.7 
pop2 2 66.7 
pop3 1 33.3 
OVERALL 5 55.6 

到目前为止,我有这对整个计算:

for (i in 1:ncol(reducedresults)) 
{reducedresults[,i]=as.vector(reducedresults[,i])} 
correct<-ifelse(reducedresults$CURRENT==reducedresults$INFERRED,1,0) 
accuracy<-sum(correct)/length(correct)*100 

我想我可以指定行找到的准确性每个班级,但我不知道如何强制它进入总结表,或者如果我甚至在正确的轨道上。

+1

对于初学者来说,它总是一个好主意来存储你的组变量(这里POP)在组变量(1,2,3)中与您的个人分开,这使得聚合更容易。你在这里用'cbind(do.call(rbind,strsplit(as.character(df $ individual),split =“_”)),df)'这样做,但最好先与它们分开。 – lmo

回答

1

您需要分组变量

> df$GROUP <- sub('_.*', '', as.character(df$INDIVIDUALS)) 

那么你可以使用table计算绝对和相对频率

> tab <- with(df, table(GROUP, CORRECT=CURRENT == INFERRED)) 
> addmargins(tab) 
     CORRECT 
GROUP FALSE TRUE Sum 
    pop1  1 2 3 
    pop2  1 2 3 
    pop3  2 1 3 
    Sum  4 5 9 
> prop.table(tab, margin=1) 
     CORRECT 
GROUP  FALSE  TRUE 
    pop1 0.3333333 0.6666667 
    pop2 0.3333333 0.6666667 
    pop3 0.6666667 0.3333333 
> prop.table(colSums(tab)) 
    FALSE  TRUE 
0.4444444 0.5555556