如何按时间节点统计累计唯一值?R语言技术求助
解决按时间节点统计个人累计唯一居住地点的问题
嗨,我来帮你搞定这个需求!你想要计算到每条记录的时间点为止,对应个人已经居住过的唯一地点数量,对吧?先看看你的代码里的小问题,再给你正确的解决方案。
首先,先修正你示例数据里的一个小错误:person列的A和B需要加引号,不然R会把它们当成未定义的变量,直接运行会报错。修正后的数据集代码是:
created <- c(2009,2010,2010,2011, 2012, 2011) person <- c("A", "A", "A", "A", "B", "B") location <- c('London','Geneva', 'London', 'New York', 'London', 'London') df <- data.frame(created, person, location)
你现有代码的问题
- 拼写错误:
arrange(Created里的列名应该是小写的created,要和数据框里的列名保持一致; mutate(unique=distinct(location))用法不对:distinct()是用来筛选去重的行,不是用来计算累计唯一值的数量,这一步完全达不到你想要的统计效果。
正确的解决方案
我们需要按个人分组,先按时间排序,然后累计统计每个地点首次出现的次数,用dplyr可以这样实现:
library(dplyr) df_result <- df %>% group_by(person) %>% arrange(created, .by_group = TRUE) %>% # 按个人分组后,按时间从小到大排序 mutate(unique = cumsum(!duplicated(location))) # 累计统计首次出现的地点数量 # 查看最终结果 df_result
代码逻辑解释
group_by(person):确保我们是针对每个人单独计算累计值,不会把不同人的数据混在一起;arrange(created, .by_group = TRUE):把每个人的记录按时间顺序排列,保证累计是从最早到最晚的时间节点依次进行;!duplicated(location):在每个个人的分组内,标记当前地点是否是首次出现——首次出现返回TRUE(转为数值1),重复出现返回FALSE(转为数值0);cumsum():对上面的标记值做累加,每一行的结果就是到当前时间点为止,该人居住过的唯一地点总数。
运行这段代码后,你会得到完全符合期望的unique列:c(1, 2, 2, 3, 1, 1)!
内容的提问来源于stack exchange,提问作者user3570187
相关产品推荐
相关产品推荐

