You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:35:28