R语言:统计各年份数据提交地点数量的更简洁实现方法?
问题与解答
问题描述
我有一组包含不同地点、多年份的观测数据,结构如下:
location year variable dataentry 1 1970 A 288 1 1970 A 281 1 1970 B 282 2 1970 A 282 2 1971 B 284 2 1971 B 287
其中variable和dataentry列仅用于标识存在数据提交,无实际分析价值。我需要统计各年份中有多少地点提交了数据,预期输出如下:
year NumberOfLocations 1970 2 1971 1
我目前通过以下代码实现了需求,但想知道有没有更简洁的写法:
d1 <- data %>% group_by(location, year) %>% summarise(da = mean(dataentry)) d2 <- d1 %>% count(location, year) d3 <- d2 %>% group_by(year) %>% summarise(NumberOfLocations = sum(n))
简洁实现方式
当然有更简洁的写法,核心思路是聚焦「统计每年的唯一地点数」这个核心需求,跳过不必要的中间步骤,这里提供两种高效的方案:
方案一:先去重再统计
data %>% distinct(location, year) %>% count(year, name = "NumberOfLocations")
distinct(location, year):保留每个地点对应年份的唯一记录,自动过滤同一地点同年份的重复数据count(year, name = "NumberOfLocations"):按年份分组统计数量,直接指定结果列名为需求中的NumberOfLocations
方案二:直接分组统计唯一地点数
data %>% group_by(year) %>% summarise(NumberOfLocations = n_distinct(location))
group_by(year):按年份分组n_distinct(location):直接统计每组内的唯一地点数量,一步到位得到目标结果
这两种方法都能精准输出预期结果,且比原代码更简洁高效,无需创建多个中间变量。
内容的提问来源于stack exchange,提问作者Johanna
相关产品推荐
相关产品推荐

