[英]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_rate
和fixed_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.