2016-07-21 13 views
0

Ich möchte ganze Zeilen in einem Datenrahmen basierend auf der Spalte samples wiederholen.Wiederholen Sie die Zeilen in einem Datenrahmen basierend auf Werten in einer bestimmten Spalte

Mein Eingang:

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

Meine erwartete Ausgabe:

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' 

Eine Vorstellung, wie es mit Bedacht erfüllen?

+3

Sie 'df verwenden können [rep (seq (nrow (df)), df $ Proben),]' – mtoto

Antwort

1

Wir können expandRows verwenden, um die Zeilen zu erweitern basierend auf dem Wert in der Spalte ‚Proben‘, dann umwandeln zu data.table, gruppiert nach ‚chr‘, fügen wir die Spalten zusammen mit Folge von Reihen sprintf 'zu aktualisieren, mit der Proben Spalte.

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 

HINWEIS: data.table wird geladen, wenn wir splitstackshape laden.

2

Sie können diese unter Verwendung einer Base R (dh Vermeidung data.tables), mit dem folgenden Code erreichen:

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) 

Die Grundidee ist, eine Funktion zu definieren, die eine einzelne Zeile von Ihren ersten Daten nehmen. Rahmen und doppelte Zeilen basierend auf dem Wert in der samples Spalte (sowie das Erstellen der verschiedenen Zeichenfolgen, die Sie suchen). Diese Funktion wird dann auf jede Zeile Ihres ursprünglichen data.frames angewendet. Die Ausgabe ist eine Liste von data.frames, die dann unter Verwendung des do.call-Musters zu einem einzelnen data.frame zusammengefasst werden müssen. (Auf CRAN) und die data.frame spezifische Version der Karten

Der obige Code kann purrr Paket mithilfe der Hadley Wickhams gemacht sauberer werden (siehe Dokumentation für die by_row Funktion), aber dies kann viel des Guten für das, was Sie sein bin danach.

0

Beispiel Datenrahmen Funktion aus S4Vector Paket mit:

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

wobei Y Spalte die Anzahl der Male darstellt, dessen entsprechende Zeile zu wiederholen.

Ergebnis:

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