在R中处理DataFrame:site列重复时合并lat/long非空值
R中合并重复site的非空值并保留唯一site
原始数据
现有如下R数据框:
| site | lat | long | site_code |
|---|---|---|---|
| a | 12 | 34 | a1 |
| b | 23 | 23 | b3 |
| c | 34 | 23 | c4 |
| d | na | na | na |
| a | na | na | na |
| c | na | na | na |
需求:保留唯一的site列表,合并重复site对应的非空lat、long和site_code,得到如下结果:
| site | lat | long | site_code |
|---|---|---|---|
| a | 12 | 34 | a1 |
| b | 23 | 23 | b3 |
| c | 34 | 23 | c4 |
| d | na | na | na |
解决方案
使用dplyr包分组聚合,提取每个site对应的非空值:
# 先构造原始数据框(如果已有可跳过) df <- data.frame( site = c("a", "b", "c", "d", "a", "c"), lat = c(12, 23, 34, NA, NA, NA), long = c(34, 23, 23, NA, NA, NA), site_code = c("a1", "b3", "c4", NA, NA, NA), stringsAsFactors = FALSE ) # 安装并加载dplyr(未安装则先运行注释行) # install.packages("dplyr") library(dplyr) # 分组处理数据 result_df <- df %>% group_by(site) %>% summarize( # 提取组内第一个非空值,全空则保留NA lat = first(na.omit(c(lat, NA))), long = first(na.omit(c(long, NA))), site_code = first(na.omit(c(site_code, NA))), .groups = "drop" ) # 查看结果 print(result_df)
逻辑说明:按site分组后,用na.omit过滤空值,再取第一个有效值;如果组内全为空,通过追加NA保证返回NA而非空值,最后取消分组状态得到目标数据框。
内容的提问来源于stack exchange,提问作者Eizy
相关产品推荐
相关产品推荐

