如何用tidyverse在R中重复数据框内包含特定值的行?
基于tidyverse的极简实现方案
核心使用tidyr包的uncount()函数,该函数专门用于根据指定的计数重复对应行,代码如下:
library(tidyverse) # 原始数据 df <- data.frame(name1 = c("x","y","z"), name2 = c(0,1,2)) # 处理代码 result <- df %>% # 定义重复次数:x/y行重复2次,其余行保留1次 mutate(repeat_n = ifelse(name1 %in% c("x", "y"), 2, 1)) %>% # 根据重复次数字段展开行,自动删除中间生成的repeat_n列 uncount(repeat_n)
运行后输出的result即为需求结果:
name1 name2 1 x 0 2 x 0 3 y 1 4 y 1 5 z 2
备选实现(行筛选拼接法)
如果不想新增中间字段,也可以通过筛选+行绑定的方式实现:
result <- df %>% # 筛选出需要重复的行,和原数据直接拼接 bind_rows(filter(., name1 %in% c("x", "y"))) %>% # 按name1排序保证输出顺序符合要求 arrange(name1)
两种方案都属于tidyverse生态内的标准写法,第一种逻辑更清晰,也不会打乱原始数据的行相对顺序,更推荐使用。
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

