在列R中按组计算百分比组

时间:2016-02-10 22:44:08

标签: r statistics

再一次,我在R中完全是新手,并尝试对我面临的问题进行排序。 我有一个数据集" ds"列#34; group"和#34;匹配" 我需要计算每组列匹配组的百分比 第一组 001 第二组 002 ,第三组 003 ,依此类推。

我现在有一个数据:

>ds

group   col1    col2       match  
 001       F       M       FALSE   
 001       F       M       FALSE    
 001       F       M       FALSE    
 002       F       M       FALSE 
 002       M       M       TRUE    
 003       M       F       FALSE
 003       F       F       TRUE    
 003       F       F       TRUE    
 003       F       M       FALSE    
 004       F       M       FALSE 
 005       F       F       TRUE 
 005       M       F       FALSE    
 005       M       M       TRUE    
 006       M       M       TRUE         
 006       F       M       FALSE 
 006       F       M       FALSE
 006       F       M       FALSE
 006       F       M       FALSE
 006       F       F       TRUE
 006       F       M       FALSE 
 006       F       M       FALSE



Desired result:


group | col1   |  col2  |  match  | mismatch % | Match %
 001       F       M       FALSE        1.0         0    
 001       F       M       FALSE    
 001       F       M       FALSE    
 002       F       M       FALSE        0.50       0.50
 002       M       M       TRUE    
 003       M       F       FALSE        0.50       0.50
 003       F       F       TRUE    
 003       F       F       TRUE    
 003       F       M       FALSE    
 004       F       M       FALSE        1.0        0
 005       F       F       TRUE         0.66       0.33
 005       M       F       FALSE    
 005       M       M       TRUE    
 006       M       M       TRUE         
 006       F       M       FALSE        0.75       0.25
 006       F       M       FALSE
 006       F       M       FALSE
 006       F       M       FALSE
 006       F       F       TRUE
 006       F       M       FALSE 
 006       F       M       FALSE

我知道如何计算整列:

percentage <- table(ds$match)
cbind(percentage,prop.table(percentage))

但是我的解决方案不能采用它

由于

1 个答案:

答案 0 :(得分:3)

这是使用dplyr

进行此操作的一种方法

我们可以在这里利用两件事:你有一个充满真/假值的列,以及你所拥有的不匹配数量只是1减去匹配的比例。

library(dplyr)
# test data
data <- data.frame(group = factor(c(1,1,1,2,2)), col1 = c(1,1,1,1,0), col2 = c(0,0,0,0,0),
               match = c(F,F,F,F,T))

# group by group, then sum the T/F vector and divide by the number of data
# points per group
desired <- data %>% group_by(group) %>% summarise(Match_per = sum(match)/length(match))

# the mismatch is 1 minus the match
desired$Mismatch <- 1 - desired$Match

data$Match_percent <- NA
data$Mismatch_percent <- NA
data[which(duplicated(data$group) == FALSE),
which(colnames(data) %in%c("Match_percent", 
    "Mismatch_percent"))] <- desired[,=1] 

输出

  group col1 col2 match Match_percent Mismatch_percent
1     1    1    0 FALSE           0.0              1.0
2     1    1    0 FALSE            NA               NA
3     1    1    0 FALSE            NA               NA
4     2    1    0 FALSE           0.5              0.5
5     2    0    0  TRUE            NA               NA