You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按时间节点统计累计唯一值?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

代码逻辑解释

  1. group_by(person):确保我们是针对每个人单独计算累计值,不会把不同人的数据混在一起;
  2. arrange(created, .by_group = TRUE):把每个人的记录按时间顺序排列,保证累计是从最早到最晚的时间节点依次进行;
  3. !duplicated(location):在每个个人的分组内,标记当前地点是否是首次出现——首次出现返回TRUE(转为数值1),重复出现返回FALSE(转为数值0);
  4. cumsum():对上面的标记值做累加,每一行的结果就是到当前时间点为止,该人居住过的唯一地点总数。

运行这段代码后,你会得到完全符合期望的unique列:c(1, 2, 2, 3, 1, 1)!

内容的提问来源于stack exchange,提问作者user3570187

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:48:38