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
相关产品推荐
相关产品推荐

