2017-12-21 7 views
0

Gegeben ein Datenrahmen, in dem jede Beobachtung in einer Spalte eine Zeichenfolge der Form "x ~ y" ist, wobei x und y Ganzzahlen sind.Eine Zeichenfolge in einem Datenrahmen in einen Vektor umwandeln und den Datenrahmen auflösen

Ziel ist es, die Zeichenfolge "x ~ y" in einen Vektor zu transformieren, c (x..y), eine Folge von Zahlen, die mit ganzzahl x beginnen und mit ganzzahl y enden.

Schließlich muss der Datenrahmen nicht verschachtelt werden, so dass jedes Element des Vektors seine eigene Zeile erhält und die anderen Spalten ordnungsgemäß wiederholt werden.

Zum Beispiel, hier ist ein Datenrahmen:

A  B 
A1 -1~1 
A2 1~3 
A3 2~4 

Die obige Datenrahmen folgt geändert werden sollte:

A  B 
    A1 -1 
    A1 0 
    A1 1 
    A2 1 
    A2 2 
    A2 3 
    A3 2 
    A3 3 
    A3 4 

Es ist unmöglich, die str_replace Beispiele zu setzen, wie es viele Fälle .. Wie mache ich diesen Code ??

+0

'dff <- seperate_rows (df, B, sep =" ~ "); do.call (bind_rows, lapply (split (dff, dff $ A), function (x) {data.frame (A = Kopf (x $ A, 1), B = seq (min (x $ B), max (x $ B)))})) sollte damit umgehen. – Abdou

Antwort

1

Da Ihre B-Spalte leicht in einen Ausdruck umgewandelt werden kann, der Ihnen gibt, was Sie wollen, würde ich den folgenden Ansatz verwenden.

# Using tidyverse for stringr (str_replace), tidyr (unnest), and purrr (map) 
library(tidyverse) 

# recreating your dataframe 
df <- data.frame(A=c("A1","A2","A3"),B=c("-1~1","1~3","2~4"), stringsAsFactors = FALSE) 

Diese Lösung besteht aus drei Teilen. Transformieren Sie zuerst die Zeilen in der B-Spalte in seq-Ausdrücke. So wird "x ~ y" zu "seq (x, y, by = 1)".

df$B <- str_replace(df$B,"\\~",",") 
df$B <- paste("seq(",df$B,",by=1)") 

Eines der schönen Dinge über R ist, wenn Sie Zeichenfolgen mit R Ausdrücke erzeugen können, können Sie diese dann bewerten mit „eval (Parse())“ so ...

df$B <- map(df$B, ~ eval(parse(text=.))) 

Alternativ könnten Sie die map() -Funktion aufrufen, die Ihre ursprünglichen "x ~ y" -Zeichenfolgen verwendet und den Vektor der Ganzzahlen zurückgibt, die Sie möchten, aber ich denke, dass diese Lösung am wenigsten tippen (denke ich?).

Wie auch immer Sie es gemacht haben, Sie haben jetzt eine B-Spalte, in der jede Beobachtung ein ganzzahliger Vektor ist.

Für den letzten Schritt, nest die Vektoren in B mit der Tidyr-Funktion, unnest. Dies wird A-Spaltenwerte in Zeilen automatisch nach Bedarf wiederholen.

> df <- unnest(df) 
> df 
    A B 
1 A1 -1 
2 A1 0 
3 A1 1 
4 A2 1 
5 A2 2 
6 A2 3 
7 A3 2 
8 A3 3 
9 A3 4 
Verwandte Themen