如何在R语言中实现数据集行重复及指定列值修改
解决方案
你可以通过以下两种方法实现需求:
方法一:先重复行再修改列值
利用dplyr的slice先完成行重复,再通过行位置判断修改指定列:
library(dplyr) # 加载原始数据 dat <- read.table(text=" ID GO Class N1 L1 K1 1 1 01-03 0 3 4 2 3 01-03 0 3 6 3 2 01-03 0 5 5 4 5 01-03 0 2 1 1 6 01-03 0 1 1 ", header=TRUE) # 生成目标数据集 result <- dat %>% slice(rep(1:n(), each = 2)) %>% mutate( Class = ifelse(row_number() %% 2 == 0, "0", Class), N1 = ifelse(row_number() %% 2 == 0, 1, N1), L1 = ifelse(row_number() %% 2 == 0, NA, L1), K1 = ifelse(row_number() %% 2 == 0, NA, K1) ) # 查看结果 print(result)
代码说明
slice(rep(1:n(), each = 2)):将每行重复2次,得到原行+复制行的基础结构row_number() %% 2 == 0:判断是否为复制出来的偶数行,对这类行的指定列进行赋值修改- 若你的
Class列需要数值型的0,去掉引号即可
运行后输出与预期一致:
ID GO Class N1 L1 K1 1 1 1 01-03 0 3 4 2 1 1 0 1 NA NA 3 2 3 01-03 0 3 6 4 2 3 0 1 NA NA 5 3 2 01-03 0 5 5 6 3 2 0 1 NA NA 7 4 5 01-03 0 2 1 8 4 5 0 1 NA NA 9 1 6 01-03 0 1 1 10 1 6 0 1 NA NA
方法二:构造新行再合并
先提取原数据的ID和GO列构造新行,再与原数据合并后排序:
library(dplyr) # 构造新行 new_rows <- dat %>% select(ID, GO) %>% mutate(Class = "0", N1 = 1, L1 = NA, K1 = NA) # 合并并排序,保证原行在前、新行在后 result <- bind_rows(dat, new_rows) %>% arrange(ID, GO, desc(Class))
这种方式逻辑更直观,适合需要明确拆分步骤的场景。
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

