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

R语言按指定列分组按日期取最新非NA值生成新dataframe

R实现分组提取最新非空Value记录的代码

测试数据构造

先构造和示例一致的输入数据,方便直接测试效果:

df <- read.table(text = "Team    Date             Value        Shape        Value_2
A       2021-01-01       500432       Triangle     123
A       2021-01-02       NA           Triangle     23
A       2021-01-03       NA           Triangle     543
B       2021-01-01       NA           Square       8543
B       2021-01-02       473929       Circle       NA
B       2021-01-03       NA           Circle     356
C       2021-01-01       750830       Rectangle    984
C       2021-01-02       894032       Rectangle    NA
C       2021-01-03       NA           Rectangle    342", header = TRUE)

方法一:dplyr包实现(推荐,可读性高)

这是R数据处理最常用的方案,逻辑清晰易维护:

# 加载包,未安装的话先运行 install.packages("dplyr")
library(dplyr)

result <- df %>%
  # 转换为日期格式保证排序正确,已经是日期格式可跳过这行
  mutate(Date = as.Date(Date)) %>%
  # 过滤掉Value为NA的记录
  filter(!is.na(Value)) %>%
  group_by(Team) %>%
  # 组内按日期降序排列,最新的排在最前
  arrange(desc(Date), .by_group = TRUE) %>%
  # 取每组第一条即最新的非空记录
  slice(1) %>%
  # 保留需要的4个字段
  select(Team, Date, Value, Shape) %>%
  ungroup()

方法二:基础R实现(无需安装第三方包)

适合不想额外安装依赖包的场景:

# 转换日期格式,已经是日期格式可跳过这行
df$Date <- as.Date(df$Date)
# 过滤Value非空的记录
df_non_na <- df[!is.na(df$Value), ]
# 按Team分组取每组日期最大的行
result <- do.call(rbind, by(df_non_na, df_non_na$Team, function(sub_df) {
  sub_df[which.max(sub_df$Date), c("Team", "Date", "Value", "Shape")]
}))
# 重置行号
rownames(result) <- NULL

两种方法运行后得到的result都和预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:09:03