【问题标题】:calculating percentage group by group in a column R在R列中逐组计算百分比
【发布时间】:2016-02-11 09:08:30
【问题描述】:

再次,我在 R 中完全是新手,并试图对我面临的问题进行排序。 我有一个数据集“ds”,列“组”和“匹配” 我需要计算每组列匹配组的百分比 第一组是 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

我知道如何计算整列的 if:

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

但不能将它用于我的解决方案显示更高

谢谢

【问题讨论】:

  • 你只想要prop.table(table(ds$group,ds$match), 1) 吗?
  • 您好 theletemail,感谢您的回答,看来您的解决方案确实按组计算列匹配的百分比,但问题是:) 如何以所需格式设置它?跨度>
  • 您可以执行类似ds$match_per &lt;- with(ds, ave(match, group, FUN=function(x) c(sum(x)/length(x), rep(NA,length(x)-1)))) 的操作,但拥有所有空单元格似乎有点浪费。
  • 感谢 theletemail,它可以工作,但奇怪的是,有时它计算为 0.0000000 有时为 0 :) 与 1 相同,1.0000000 看不到依赖关系.....你说得对行,但我需要全部格式化以保持行数,以便稍后添加变量

标签: r statistics


【解决方案1】:

这是使用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

【讨论】:

  • 感谢您的回答 M_Fido,对不起,我可能会问一个愚蠢的问题,但是 :) 我究竟应该如何使用此解决方案来创建所需结果中显示的内容并保持该特定格式?对于每组计算的简单组,这也适用:prop.table(table(ds$group,ds$match), 1)
  • 我更新了代码以保持您想要的格式类型。
  • 没问题!如果对您有用,请接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2015-01-02
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多