如何用R语言将数据框NA值替换为前置元素集合而非单个值?
用tidyverse实现循环填充拆分后的数据框NA值
首先加载tidyverse包并定义原始数据:
library(tidyverse) d = data.frame(obs = 1:4, comp = c("7_10","5","6_9","1_2_6_9"))
实现步骤与代码
通过按行处理+循环序列生成的方式,即可实现用每行的前置元素集合循环填充NA:
d_processed <- d %>% # 拆分comp列,不足的位置补NA,列名格式为comp_1、comp_2... separate_wider_delim(comp, delim = "_", names_sep = "_", too_few = "align_start") %>% # 按行处理,确保每行的循环序列独立 rowwise() %>% mutate( # 提取当前行的非NA元素作为循环基准序列 cycle_seq = list(na.omit(c_across(starts_with("comp")))), # 生成与comp列数量匹配的循环填充向量 filled_vec = list(rep(cycle_seq, length.out = sum(str_detect(colnames(.), "^comp_")))), # 将填充向量对应赋值到每个comp列 across(starts_with("comp"), ~ filled_vec[[1]][as.integer(str_extract(cur_column(), "\\d+"))]) ) %>% # 移除临时辅助列,取消行分组 select(-cycle_seq, -filled_vec) %>% ungroup()
结果说明
处理后的数据框d_processed完全符合需求:
- 第一行:
comp_1=7, comp_2=10, comp_3=7, comp_4=10(用7,10循环填充) - 第二行:所有comp列均为
5(单元素循环) - 第三行:
comp_1=6, comp_2=9, comp_3=6, comp_4=9(用6,9循环填充) - 第四行:保持原始拆分结果
1,2,6,9(无NA无需填充)
内容的提问来源于stack exchange,提问作者Angelos Amyntas
相关产品推荐
相关产品推荐

