如何正确计算特定年份中各国相关咨询的占比?
多国家咨询数据的占比计算方式选择
我有一份客户咨询各国信息的数据集,单次咨询可能涉及1个或多个国家,多国家记录在同一列中用逗号分隔。现在需要明确:计算特定年份中某国相关咨询的占比时,应该采用哪种方式?
方式一:拆分多国家行后计算占比
先拆分含多国家的行(增加观测数),统计拆分后的总观测数与该国观测数后计算占比,对应R代码:
df %>% separate_rows(Country) %>% group_by(Year) %>% mutate(n.Total = n()) %>% group_by(Year, Country) %>% mutate(n.Country = n()) %>% group_by(Year) %>% mutate(Percentage = n.Country/n.Total*100) %>% distinct(Country, .keep_all = T)
方式二:基于原始观测数计算占比
保留原始咨询的总观测数,统计该国出现次数后计算占比,对应R代码:
df %>% group_by(Year) %>% mutate(n.Total = n()) %>% separate_rows(Country) %>% group_by(Year, Country) %>% mutate(n.Country = n()) %>% group_by(Year) %>% mutate(Percentage = n.Country/n.Total*100) %>% distinct(Country, .keep_all = T)
示例数据集
structure(list(Year = c(2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020), Country = c("A", "B", "A,B", "C", "C", "A", "A, C", "B", "B,C", "A", "A,C", "C", "A", "B,C", "A", "B", "A", "B", "C", "B,C")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))
两种方式的核心差异与选择逻辑
两种方式的本质区别是分母的统计口径不同:
- 方式一的分母是「所有国家被提及的总次数」(一条涉及多个国家的咨询会被拆分成多条记录,总观测数是所有国家提及次数的总和),计算的是该国在所有咨询的国家提及中所占的比例。比如一条同时咨询A和B的记录,会被分别算入A和B的统计中,分母也会增加2。
- 方式二的分母是「原始咨询的总条数」(不管每条咨询涉及多少国家,都只算1次),计算的是涉及该国的咨询数占总咨询数的比例。比如一条同时咨询A和B的记录,会被算入A和B的
n.Country,但分母始终是原始的咨询条数。
具体选哪种,完全看你的业务需求:
- 若想了解该国在所有被咨询的国家里的曝光占比,选方式一;
- 若想统计有多大比例的咨询涉及该国,选方式二。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

