根据特定列中的值重复数据框中的行

use*_*668 3 r repeat

我想根据列在数据框中重复整行samples

我的输入:

df <- 'chr start end samples
        1   10   20    2
        2   4    10    3'
df <- read.table(text=df, header=TRUE)
Run Code Online (Sandbox Code Playgroud)

我的预期输出:

df <- 'chr start end  samples
        1   10   20   1-10-20-s1
        1   10   20   1-10-20-s2
        2   4    10   2-4-10-s1
        2   4    10   2-4-10-s2
        2   4    10   2-4-10-s3'
Run Code Online (Sandbox Code Playgroud)

一些想法如何明智地执行它?

akr*_*run 5

我们可以使用expandRows基于 'samples' 列中的值扩展行,然后转换为data.table,按 'chr' 分组,我们将列与行序列粘贴在一起,sprintf用于更新 'samples' 列。

library(splitstackshape)
setDT(expandRows(df, "samples"))[,
     samples := sprintf("%d-%d-%d-%s%d", chr, start, end, "s",1:.N) , chr][]
#  chr start end    samples
#1:   1    10  20 1-10-20-s1
#2:   1    10  20 1-10-20-s2
#3:   2     4  10  2-4-10-s1
#4:   2     4  10  2-4-10-s2
#5:   2     4  10  2-4-10-s3
Run Code Online (Sandbox Code Playgroud)

注意:data.table将在我们加载时加载splitstackshape