繁体   English   中英

grepl 和 group_by 使用 dplyr 在 R 中进行汇总

[英]grepl and group_by to summarise in R using dplyr

我有一个 dataframe:

region_calls = data.frame(
  samples = c("S1", "S2", "S3", "S1", "S2", "S3"),
  CN_Region = c("A","A","A", "B", "B", "B"), 
  CN_State = c("0", "NoCall1or2", "1", "2", "NoCall1or2", "NoCall")
)

我试图这样做:

region_calls %>% group_by(CN_Region) %>%
  summarise(call_rate = sum(grepl("0|NoCall_1or2|1|NoCall_2or3|2|3|NoCall_3or4|4", CN_State)/n()),
            fixed_call_rate = sum(grepl("0|1|2|3|4", CN_State)/n()))

但是每个区域都给出相同的call_ratefixed_call_rate

预期的答案是:

预期答案

基本上,我从分子中排除NoCall (不是NoCall1or2 ),而不是从分母中的n()

我错过了什么? 我还在分母中尝试nrow(.) 我看到了一些类似的问题,但他们分别处理grepl而不是我打算的。 也欢迎任何更清洁的dplyr方法。

对于call_rate ,我们可以计算没有"NoCall"的值的比率。 call_rate不需要正则表达式,因为它是完全匹配而不是模式匹配。 对于fixed_call_rate ,我们使用grepl来查找其中只有数字的值的比率。 我们为其添加单词边界( \\b ),使其仅匹配"1""2"等而不"NoCall1or2"

library(dplyr)

region_calls %>%
  group_by(CN_Region) %>%
  summarise(call_rate = mean(CN_State != "NoCall"),
            fixed_call_rate = mean(grepl('\\b\\d\\b', CN_State)))

#  CN_Region call_rate fixed_call_rate
#  <fct>         <dbl>           <dbl>
#1 A             1               0.667
#2 B             0.667           0.333

我们也可以使用data.table

library(data.table)
setDT(region_calls)[, .( call_rate = mean(CN_State != "NoCall"),
        fixed_call_rate = mean(grepl('\\b\\d\\b', CN_State))), CN_Region]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM