2016-07-21 19 views
0

samples列に基づいてデータフレーム内の行全体を繰り返す必要があります。特定の列の値に基づいてデータフレーム内の行を繰り返す

マイ入力:

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

私の予想される出力:

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' 

賢く、それを実行するためにどのようにいくつかのアイデア?

+3

あなたは '[、($サンプルDF配列(nrow(DF))、)担当者]' DFを使用することができます – mtoto

答えて

1

'サンプル'列の値に基づいて行を展開し、 'chr'でグループ化されたdata.tableに変換すると、sprintfを使用して列の列とともに 'サンプルの列。

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 

注:私たちはsplitstackshapeをロードする際data.tableがロードされます。

2

は、次のコードで、この使用してベースR(すなわち回避data.tables)を達成することができます

df <- 'chr start end samples 
     1 10 20 2 
     2 4 10 3' 

df <- read.table(text = df, header = TRUE) 

duplicate_rows <- function(chr, starts, ends, samples) { 
    expanded_samples <- paste0(chr, "-", starts, "-", ends, "-", "s", 1:samples) 
    repeated_rows <- data.frame("chr" = chr, "starts" = starts, "ends" = ends, "samples" = expanded_samples) 

    repeated_rows 
} 

expanded_rows <- Map(f = duplicate_rows, df$chr, df$start, df$end, df$samples) 

new_df <- do.call(rbind, expanded_rows) 

基本的な考え方は、あなたの最初のデータから単一の行を取る関数を定義することです。フレームを作成し、samples列の値に基づいて行を複製します(後に別の文字列を作成することもできます)。この関数は、最初のdata.frameの各行に適用されます。出力は、do.callパターンを使用して1つのdata.frameに再合成する必要があるdata.framesのリストです。

上記のコードは、Hadley Wickhamのpurrrパッケージ(CRAN)とdata.frame特有のバージョンのマップ(by_row関数のドキュメントを参照)を使用してよりクリーンにすることができますが、後で。

0

S4Vectorパッケージからデータフレーム機能を使用して実施例:Y列は、その対応する行を繰り返す回数を表し

df <- DataFrame(x=c('a', 'b', 'c', 'd', 'e'), y=1:5) 
rep(df, df$y) 

結果:

DataFrame with 15 rows and 2 columns 
       x   y 
    <character> <integer> 
1    a   1 
2    b   2 
3    b   2 
4    c   3 
5    c   3 
...   ...  ... 
11   e   5 
12   e   5 
13   e   5 
14   e   5 
15   e   5 
関連する問題