R语言按Name分组计算Repeat和Allowed均为Yes的行占比实现方法
解决方案
dplyr 实现
你原代码的错误有两处:
- 提前执行
filter会把无符合条件记录的分组(比如C)直接过滤,导致最终结果缺失对应Name的行 - 分母用
length(df$Name)取的是全数据集总行数,不是每个分组的总行数,计算的比例不符合要求
正确写法如下:
library(dplyr) df1 <- data.frame(Name = c("A", "B", "C", "A", "B", "B", "C", "C", "A", "A"), Repeat = c("Yes", "Yes", "No", "Yes", "Yes", "Yes", "No", "No", "Yes", "Yes"), Allowed = c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "No")) df_results <- df1 %>% group_by(Name) %>% summarise( Calculation = sum(Repeat == "Yes" & Allowed == "Yes") / n() ) print(df_results) #> # A tibble: 3 × 2 #> Name Calculation #> <chr> <dbl> #> 1 A 0.5 #> 2 B 1 #> 3 C 0
base R aggregate 实现
如果你想用base R的aggregate函数,正确写法如下:
df1$flag <- df1$Repeat == "Yes" & df1$Allowed == "Yes" df_results <- aggregate(flag ~ Name, data = df1, FUN = function(x) sum(x)/length(x)) colnames(df_results)[2] <- "Calculation" print(df_results) #> Name Calculation #> 1 A 0.5 #> 2 B 1.0 #> 3 C 0.0
内容的提问来源于stack exchange,提问作者vpk25
相关产品推荐
相关产品推荐

