2016-07-29 31 views
1

ich diesen Datenrahmen in R. habenErstellen Sie zusätzliche Zeilen in Datenrahmen in R für einzigartige Elemente in Spalte

df <- read.table(text=" 
nr first second 
n1 a;a;b 1;1;7 
n2 c;c 3;3 
n3 d;e 4;4", header=T, stringsAsFactors=FALSE) 

Und ich möchte dies so zu einem Datenrahmen konvertieren.

nr first second 
n1 a  1 
n1 b  7 
n2 c  3 
n3 d  4 
n3 e  4 

Für jede Zeile, ich möchte nur die einzigartigen Elemente in "zuerst"; und für jedes eindeutige Element möchte ich eine separate Zeile.

Weiterhin sind die Spalten 'first' und 'second' verknüpft. Zum Beispiel entspricht 'b' in 'a; a; b' 7 in '1; 1; 7'. Ich möchte nur das Element in "Sekunde" behalten, das dem Element in "zuerst" entspricht.

Antwort

3

separate_rows() von tidyr Paket ist die Funktion, die Sie suchen:

library(tidyr) 
unique(separate_rows(df, sep = ";", first:second)) 

# nr first second 
# 1 n1  a  1 
# 3 n1  b  7 
# 4 n2  c  3 
# 6 n3  d  4 
# 7 n3  e  4 
2

Wir verwenden cSplit

library(splitstackshape) 
unique(cSplit(df, c("first", "second"), ";", "long")) 
# nr first second 
#1: n1  a  1 
#2: n1  b  7 
#3: n2  c  3 
#4: n3  d  4 
#5: n3  e  4 

oder ohne externe Pakete zu verwenden, wir Schleife durch die zweite und dritte Spalte, geteilt durch das Trennzeichen (strsplit(x, ";")), stack es zu data.frame, dann cbind die list Elemente, erhalten Sie die unique Zeilen und ändern Sie die Spaltennamen zu denen des ursprünglichen Datasets.

lst <- lapply(df[2:3], function(x) stack(setNames(strsplit(x, ";"), df[,1]))) 
setNames(unique(cbind(lst[[1]][2:1], lst[[2]][1])), names(df)) 
# nr first second 
#1 n1  a  1 
#3 n1  b  7 
#4 n2  c  3 
#6 n3  d  4 
#7 n3  e  4