如何让DataFrame中type为N的行沿用最近type为P的行的id值
问题描述
我有如下格式的tibble类型DataFrame:
# A tibble: 15 × 2 type id <chr> <chr> 1 P A1 2 N A2 3 N A3 4 N A4 5 P A5 6 N A6 7 N A7 8 P A8 9 N A9 10 N A10 11 P A11 12 N A12 13 N A13 14 N A14 15 P A15
需求:type为"P"的行保留原有id值,后续type为"N"的行沿用该id值,直到下一个type为"P"的行出现,之后的"N"行改用新的"P"行的id值,最终得到如下结果:
# A tibble: 15 × 2 type id <chr> <chr> 1 P A1 2 N A1 3 N A1 4 N A1 5 P A5 6 N A5 7 N A5 8 P A8 9 N A8 10 N A8 11 P A11 12 N A11 13 N A11 14 N A11 15 P A15
解决方案
方法一:分组替换(dplyr)
通过创建分组标识,将每个"P"及其后续的"N"划分为同一组,然后让组内所有行使用该组第一行的id:
library(dplyr) # 构造示例数据(已有数据可跳过此步) df <- tibble( type = c("P", "N", "N", "N", "P", "N", "N", "P", "N", "N", "P", "N", "N", "N", "P"), id = c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15") ) # 处理数据 df_processed <- df %>% # 生成分组:每遇到"P"就创建新分组 mutate(group = cumsum(type == "P")) %>% group_by(group) %>% # 将组内id替换为该组第一个id值 mutate(id = first(id)) %>% ungroup() %>% # 移除临时分组列 select(-group)
方法二:缺失值填充(dplyr + tidyr)
先将"N"行的id设为缺失值,再用向下填充的方式自动沿用前一个"P"行的id:
library(dplyr) library(tidyr) df_processed <- df %>% # 将N行的id转为缺失值 mutate(id = if_else(type == "N", NA_character_, id)) %>% # 向下填充id,使用前一个非缺失值 fill(id, .direction = "down")
两种方法都能得到目标结果,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者marcelklib
相关产品推荐
相关产品推荐

