如何在R中合并相同id和date的行,整合time1与time2列
R语言:按id和date合并行并整合非NA值
你需要按id和date分组,将每组内多行的非NA值整合到对应列,合并为单行。以下是两种可行的方案:
1. 使用tidyverse(dplyr包)
先加载dplyr包,按id和date分组后,对目标列提取非NA值:
# 加载包 library(dplyr) # 原始数据 id <- c('A', 'B', 'C', 'B', 'C') date <- c('2023-10-09', "2023-10-10", "2023-10-10", "2023-10-10", "2023-10-10") time1 <- c('2023-10-09 05:55:55', '2023-10-10 05:55:55', NA, NA, '2023-10-10 10:55:55') time2 <- c('2023-10-09 06:10:55', NA, '2023-10-10 20:55:55', '2023-10-10 20:59:55', NA) df <- data.frame(id, date, time1, time2) # 合并处理 df_merged <- df %>% group_by(id, date) %>% summarize(across(c(time1, time2), ~ na.omit(.)[1]), .groups = 'drop') # 查看结果 df_merged
运行后输出:
id date time1 time2 <chr> <chr> <chr> <chr> 1 A 2023-10-09 2023-10-09 05:55:55 2023-10-09 06:10:55 2 B 2023-10-10 2023-10-10 05:55:55 2023-10-10 20:59:55 3 C 2023-10-10 2023-10-10 10:55:55 2023-10-10 20:55:55
2. 使用基础R(无需额外包)
用aggregate函数按分组条件处理,自定义函数提取非NA值:
# 原始数据(同上) id <- c('A', 'B', 'C', 'B', 'C') date <- c('2023-10-09', "2023-10-10", "2023-10-10", "2023-10-10", "2023-10-10") time1 <- c('2023-10-09 05:55:55', '2023-10-10 05:55:55', NA, NA, '2023-10-10 10:55:55') time2 <- c('2023-10-09 06:10:55', NA, '2023-10-10 20:55:55', '2023-10-10 20:59:55', NA) df <- data.frame(id, date, time1, time2) # 合并处理 df_merged <- aggregate(. ~ id + date, data = df, FUN = function(x) na.omit(x)[1]) # 查看结果 df_merged
运行后输出与tidyverse方案一致。
逻辑说明
两种方案核心逻辑相同:
- 按
id和date作为分组依据 - 对每组的
time1、time2列,提取第一个非NA值(因每组目标列仅存在一个有效非NA值,因此提取第一个即可得到目标结果)
内容的提问来源于stack exchange,提问作者Sunnnnns
相关产品推荐
相关产品推荐

