R语言求助:如何按id在counter非缺失后用m列值填充seq列
解决方案:按分组填充指定位置后的序列值
首先模拟你的初始数据(对应图1):
library(dplyr) library(tidyr) # 模拟初始状态数据 initial_data <- tibble( id = rep(c(1, 2), each = 5), counter = c(NA, NA, 1, NA, NA, NA, 2, NA, NA, NA), m = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), seq = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) )
你之前用fill(seq, .direction = "down")没成功,是因为fill只能填充seq列自身已有的非缺失值,但你的需求是基于counter列的非缺失位置,触发后续行的seq填充为对应m的值。可以通过标记填充范围来实现:
target_data <- initial_data %>% group_by(id) %>% # 标记每个组中counter首次出现非缺失值后的所有行 mutate(fill_flag = cumsum(!is.na(counter)) >= 1) %>% # 对标记行填充m到seq,其余行保留原seq mutate(seq = ifelse(fill_flag, m, seq)) %>% select(-fill_flag) %>% ungroup() # 查看目标状态数据(对应图2) print(target_data)
代码说明:
cumsum(!is.na(counter)) >= 1:通过累计求和,将每个组中第一个counter非缺失值及之后的所有行标记为TRUEifelse(fill_flag, m, seq):仅对标记为TRUE的行,把seq替换为同组的m值,之前的行保持NA
内容的提问来源于stack exchange,提问作者Luis M. García
相关产品推荐
相关产品推荐

