在R中无ID列时填充多组起始与结束值间的内容
在无ID列的R数据框中填充多组起始/结束标记间的NA值
原始数据结构如下:
df <- structure( list( elevation = c(150L,140L, 130L, 120L, 110L, 120L, 130L, 140L, 150L, 90L, 80L, 70L,66L, 60L, 50L, 66L, 70L, 72L, 68L, 65L, 60L, 68L, 70L), code = c(NA, NA, "W", NA, NA, NA, "W", NA, NA, NA, NA, NA, "X", NA, NA, "X", NA, NA, "Y", NA, NA, "Y", NA) ), class = "data.frame", row.names = c(NA,-23L) )
需求是将code列中每组起始与结束标记(如W、X、Y)之间的NA值填充为对应标记值。
解决方案1:使用dplyr + tidyr
通过生成临时分组ID划分标记区间,再双向填充NA值:
library(dplyr) library(tidyr) df_filled <- df %>% # 生成分组ID:每遇到非NA的code值,分组序号递增 mutate(group_id = cumsum(!is.na(code))) %>% # 按分组双向填充code值 group_by(group_id) %>% fill(code, .direction = "downup") %>% ungroup() %>% # 移除临时分组列 select(-group_id) # 查看结果 df_filled
解决方案2:使用data.table
用data.table的nafill函数实现高效填充:
library(data.table) setDT(df) # 生成分组ID df[, group_id := cumsum(!is.na(code))] # 先向下填充,再向上填充补全区间 df[, code := nafill(code, type = "locf"), by = group_id] df[, code := nafill(code, type = "nocb"), by = group_id] # 移除临时分组列 df[, group_id := NULL] # 查看结果 df
两种方法核心逻辑一致:通过非NA标记划分独立区间,将区间内的NA值替换为对应标记值。
内容的提问来源于stack exchange,提问作者AnonX
相关产品推荐
相关产品推荐

