R语言补全数据框x序列后如何自动填充y值生成目标列y1
问题场景
初始构造测试数据框的代码如下:
x<- c(3, 5, 9, 12, 14) y<- c(0.2, 0.4, 0.7, 1.4, 1.8) df<- data.frame(x, y) df

之前已经实现了x列补全为0~16的连续整数,补全位置的y值默认填0,代码如下:
df <- tidyr::complete(df, x = 0:16, fill = list(y = 0)) cbind(df$x, df$y)

现在需要按规则自动生成新列y1,无需手动逐段赋值,目标y1的手动参考赋值为:
df$y1<- c(0,0,0, 0.2,0.2, 0.4,0.4,0.4,0.4, 0.7,0.7,0.7, 1.4,1.4, 1.8,1.8,1.8) cbind(df$x, df$y1)

y1的填充规则可总结为:
- 第一个原始非零y值对应的x位置之前的所有行,y1取0
- 每个原始非零y值,填充从当前x位置开始,到下一个原始非零y值对应的x位置之前的所有行
- 最后一个原始非零y值,填充到x序列的末尾
实现方案
以下两种方案均可直接运行得到和示例完全一致的结果:
- 基础R方案(无需加载额外包)
利用findInterval做区间匹配,逻辑简洁运行效率高:# 提取原始非零y对应的x断点和对应y值 break_x <- df$x[df$y != 0] val_y <- df$y[df$y != 0] # 按区间匹配生成y1 df$y1 <- c(0, val_y)[findInterval(df$x, c(-Inf, break_x))] - Tidyverse方案(适配管道操作习惯)
利用向下填充逻辑实现,可读性强:library(dplyr) library(tidyr) df <- df %>% mutate(y1 = na_if(y, 0)) %>% fill(y1, .direction = "down") %>% replace_na(list(y1 = 0))
内容的提问来源于stack exchange,提问作者Miguel Angel Arnau
相关产品推荐
相关产品推荐

