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

如何用R按最早采集日期生成每人唯一体重数据的DataFrame?

按受试者ID保留最早体重记录的R实现方法

核心方案:用dplyr分组筛选最早记录

这是最简便的实现方式,结合lubridate处理日期格式,步骤如下:

假设你的数据集名为df,包含列:subject_id(受试者ID)、weight_date(体重采集日期)、weight(体重值)。

  1. 加载工具包
library(tidyverse) # 包含dplyr(分组处理)和lubridate(日期处理)
  1. 统一日期格式(关键步骤)
    如果你的weight_date是字符型,用lubridate的ymd()/dmy()/mdy()转换为日期类型(根据你的日期格式选对应函数,比如ymd()适配"年-月-日"格式):
df <- df %>% mutate(weight_date = ymd(weight_date))
  1. 分组筛选最早记录
    按subject_id分组,保留每组中日期最早的行:
df_first_weight <- df %>%
  group_by(subject_id) %>%
  filter(weight_date == min(weight_date, na.rm = TRUE)) %>% # na.rm=TRUE忽略日期列的NA值
  ungroup()

注意:如果同一受试者同一天有多个体重记录,上述代码会保留所有同日期的行。如果想强制每组只留一行,可在ungroup()前加slice(1):

df_first_weight <- df %>%
  group_by(subject_id) %>%
  filter(weight_date == min(weight_date, na.rm = TRUE)) %>%
  slice(1) %>% # 取筛选后的第一行
  ungroup()

备选:计算平均体重的实现

如果后续需要用平均体重作为补充,代码更简单:

df_avg_weight <- df %>%
  group_by(subject_id) %>%
  summarise(avg_weight = mean(weight, na.rm = TRUE)) %>% # na.rm=TRUE忽略体重列的NA值
  ungroup()

base R实现方案(无需加载包)

如果不想用tidyverse,也可以用base R完成:

# 先转换日期格式
df$weight_date <- as.Date(df$weight_date, format = "%Y-%m-%d") # 这里format要匹配你的日期格式

# 分组筛选最早记录
df_first_weight_base <- df[ave(df$weight_date, df$subject_id, FUN = function(x) x == min(x, na.rm = TRUE)) == TRUE, ]

关于lubridate的作用

你猜的没错,lubridate主要是简化日期格式的转换——它能自动识别绝大多数常见的日期字符串格式,不用像as.Date()那样手动写format参数,避免格式不匹配的错误。如果你的日期列已经是Date类型,也可以不用lubridate。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:15:35