如何在R语言中基于最新观测值和日期行筛选并创建新数据库
保留每个Name对应最新记录的解决方案
问题场景
有超过1000行的数据库,需剔除冗余行,仅保留每个Name对应Year最新的记录。
原始数据
| Name | Year | Weight |
|---|---|---|
| John | 2021-04-03 | 203 |
| John | 2022-08-02 | 198 |
| John | 2018-08-34 | 234 |
| Patrick | 2014-05-09 | 176 |
| Patrick | 2021-03-09 | 199 |
| Patrick | 2020-09-03 | 200 |
| Peter | 2019-09-05 | 204 |
| Peter | 2017-07-14 | 209 |
| Peter | 2019-10-05 | 199 |
目标结果
| Name | Year | Weight |
|---|---|---|
| John | 2022-08-02 | 198 |
| Patrick | 2021-03-09 | 199 |
| Peter | 2019-10-05 | 199 |
一、Excel 手动操作(适合非编程用户)
- 排序:选中全量数据(含表头),点击「数据」→「排序」,设置:
- 主要关键字:
Name(升序) - 次要关键字:
Year(降序)
这样每个Name的最新记录会排在组内第一行
- 主要关键字:
- 去重:选中
Name列,点击「数据」→「删除重复值」,仅勾选Name列后确定。重复的旧记录会被删除,最终保留每组第一条最新记录
二、Python Pandas 代码(适合大数据量高效处理)
import pandas as pd # 读取数据(替换为你的数据源路径,比如CSV/Excel/数据库连接) df = pd.read_csv('your_data.csv') # 转换日期格式,自动处理无效日期(如示例中的2018-08-34会转为空值) df['Year'] = pd.to_datetime(df['Year'], errors='coerce') # 按Year降序排序,分组后取每组第一条(即最新记录) latest_df = df.sort_values('Year', ascending=False).groupby('Name').head(1) # 重置索引并保存结果 latest_df = latest_df.reset_index(drop=True) latest_df.to_csv('latest_records.csv', index=False)
三、SQL 查询(适合数据存储在数据库中)
针对MySQL、SQL Server等数据库,直接执行以下语句提取最新记录:
SELECT t1.* FROM your_table t1 INNER JOIN ( -- 先获取每个Name的最新年份 SELECT Name, MAX(Year) AS latest_year FROM your_table GROUP BY Name ) t2 ON t1.Name = t2.Name AND t1.Year = t2.latest_year;
如果同一Name在同一年份有多条记录,可根据需求添加额外筛选条件(如MAX(Weight))。
内容的提问来源于stack exchange,提问作者Gabriel Barbosa
相关产品推荐
相关产品推荐

