如何在R中按ID补全DataFrame至指定X_F范围(保留指定值)
解决方案
完整代码实现
library(tidyverse) # 构造原始数据框 DF11 <- data.frame( ID = c("A", "A", "A", "B", "B", "B", "B", "B"), X_F = c(5, 7, 9, 6, 7, 8, 9, 10), X_A = c(7, 8, 9, 3, 6, 7, 9, 10) ) # 生成目标数据框 DF112 <- DF11 %>% group_by(ID) %>% # 计算组内X_F的极值,拼接需要保留的X_F序列集合 mutate( min_XF = min(X_F), max_XF = max(X_F), target_XF = list(c(seq(0, min_XF), X_F, seq(max_XF, max_XF + 3))) ) %>% # 展开序列并去重 unnest(target_XF) %>% select(ID, target_XF) %>% distinct() %>% # 关联原数据匹配X_A值,无匹配则填充NA left_join(DF11, by = c("ID", "target_XF" = "X_F")) %>% # 调整列名并排序 rename(X_F = target_XF) %>% arrange(ID, X_F) %>% ungroup() print(DF112)
代码逻辑说明
- 分组计算极值:按
ID分组后,计算每组X_F的最小值和最大值,确定需要补全的范围边界。 - 拼接目标序列:将三个需要保留的部分拼接成列表:
- 从0到组内
X_F最小值的整数序列 - 原数据中已有的
X_F值 - 从组内
X_F最大值到最大值+3的整数序列
- 从0到组内
- 去重与关联:展开列表并去重(避免原
X_F值和补全序列重复),再通过左连接匹配原数据中的X_A值,无匹配项自动填充NA。 - 格式调整:重命名列并按
ID和X_F排序,得到目标结构。
内容的提问来源于stack exchange,提问作者Raghavan vmvs
相关产品推荐
相关产品推荐

