2017-04-20 3 views
6

Ich habe Daten, bei denen die IDs jeder Beobachtung als Sequenzen in der Regel in Form von X: Y, aber manchmal verketteten Listen gespeichert sind. Ich möchte die Daten aufräumen, so dass jede Beobachtung ihre eigene Zeile hat, so dass ich dann eine Join-Funktion verwenden kann, um aussagekräftigere IDs hinzuzufügen. Normalerweise würde ich die gather() Funktion von tidyr verwenden, um dies zu tun, aber ich habe Probleme beim Entpacken der IDs, da sie Zeichen sind.Erstellen Sie ein langes Datenformat basierend auf Sequenzen von Sequenzen, die durch Doppelpunkte und verkettete Vektoren definiert sind

Die Daten sieht wie folgt aus:

example <- data_frame(x = LETTERS[1:3], y = c("Condition 1", "Condition 2", "Condition 3"), z = c("1:3", "4:6", "c(7,9,10)")) 

example 
# A tibble: 3 × 3 
     x   y   z 
    <chr>  <chr>  <chr> 
1  A Condition 1  1:3 
2  B Condition 2  4:6 
3  C Condition 3 c(7,9,10) 

diese jedoch nicht funktionieren und alle produzieren NA:

as.numeric("1:3") 
as.integer("1:3") 
as.numeric("c(7,9,10)") 
as.integer("c(7,9,10)") 

Es muss eine einfache Möglichkeit, dies zu tun, aber ich dachte, ein langer Weg könnte sei es, die Zahlen zu extrahieren und sie als Liste zuerst zu speichern. Für die X: Y-IDs Ich kann dies tun, indem Sie die Zeichenfolge an spliting „:“ und dann eine Sequenz von einer Zahl auf die anderen zu schaffen, wie so:

example[1:2,] %>% 
+ separate(z, c("a", "b"), sep = ":") %>% 
+ mutate(a = as.numeric(a), b = as.numeric(b), new = list(seq(a, b))) 
Error in eval(expr, envir, enclos) : 'from' must be of length 1 

Allerdings hat dies nicht funktioniert.

Was ich bin mit dem Ziel für die wie folgt aussieht:

# A tibble: 9 × 3 
     x   y  z 
    <chr>  <chr> <dbl> 
1  A Condition 1  1 
2  A Condition 1  2 
3  A Condition 1  3 
4  B Condition 2  4 
5  B Condition 2  5 
6  B Condition 2  6 
7  C Condition 3  7 
8  C Condition 3  9 
9  C Condition 3 10 

Was ist der einfachste Weg, es zu erreichen?

+0

verwenden können, wenn Sie die Sprache sind erstreckt, ist es eine schlechte Idee, Code als Strings zu speichern. Wenn Sie mehr als einen Wert pro Beobachtung speichern möchten, verwenden Sie eine Listenspalte. – alistaire

+0

Ich stimme zu. Dieses Datenformat stammt aus einem Bioinformatik-Paket von Drittanbietern. Ich könnte einen Vorschlag für ihr GitHub Repo machen. –

Antwort

11

Wir tidyverse

library(tidyverse) 
example %>% 
    group_by(x) %>% 
    mutate(z = list(eval(parse(text=z)))) %>% 
    unnest 
#  x   y  z 
# <chr>  <chr> <dbl> 
#1  A Condition 1  1 
#2  A Condition 1  2 
#3  A Condition 1  3 
#4  B Condition 2  4 
#5  B Condition 2  5 
#6  B Condition 2  6 
#7  C Condition 3  7 
#8  C Condition 3  9 
#9  C Condition 3 10 
Verwandte Themen