如何在R中按v1值变化条件新增行并调整t1列值
在R中处理大文件的分组数据修改需求
现有如下数据框df:
v1 t1 c1 o1 1 1 9 1 1 1 12 2 1 2 2 1 1 2 7 2 2 1 3 1 2 1 6 2 2 2 3 1 2 2 12 2
需求说明:每次v1的值发生变化时,新增两行全1的记录(其中o1分别为1和2),同时将原对应v1分组的t1值加1,最终目标结果如下:
v1 t1 c1 o1 1 1 1 1 1 1 1 2 1 2 9 1 1 2 12 2 1 3 2 1 1 3 7 2 2 1 1 1 2 1 1 2 2 2 3 1 2 2 6 2 2 3 3 1 2 3 12 2
高效解决方案(基于data.table,适配大文件)
针对大文件处理,优先选择data.table,它的内存效率和运算速度更优:
- 加载并转换数据结构:
library(data.table) dt <- as.data.table(df)
- 生成每个
v1分组对应的新增行:
add_rows <- dt[, .(t1 = 1, c1 = 1, o1 = 1:2), by = v1]
- 对原数据的
t1字段加1:
dt[, t1 := t1 + 1]
- 合并数据并排序:
result <- rbind(add_rows, dt)[order(v1, t1)]
备选方案(基于dplyr)
如果更熟悉tidyverse语法,可以用dplyr实现:
- 加载包并生成新增行:
library(dplyr) library(tidyr) # 需要crossing函数 add_rows <- df %>% distinct(v1) %>% crossing(o1 = 1:2) %>% mutate(t1 = 1, c1 = 1)
- 修改原数据并合并排序:
result <- df %>% mutate(t1 = t1 + 1) %>% bind_rows(add_rows) %>% arrange(v1, t1)
内容的提问来源于stack exchange,提问作者EGM8686
相关产品推荐
相关产品推荐

