2017-08-07 3 views
0

Ich habe ein Format zu trennen, wo ich diese Daten haben:Spalte Split basierend auf bestimmten Separator Format

df = data.frame(id=c(1,2),name=c('A~B~C','A~B~D'),value=c('1~2~3','1~~2')) 
id name  value 
1 A~B~C  1~2~3 
2 A~B~D  1~~2 

, die die folgende Ausgabe zu erwarten ist, wenn der Spaltenname der ursprünglichen Spaltennamen gefolgt von der ist Text in der Spalte Name:

id value_A value_B value_C value_D 
1  1   2   3  
2  1       2 

ich schaffe für die die Spaltung zu erreichen, indem viele verschachtelte for-Schleifen mit auf meine Daten Zeile für Zeile zu verarbeiten. Es arbeitet mit kleinen Beispieldaten, aber sobald die Daten riesig sind, ist die Zeit ein Problem.

Es könnte auch mehr als 1 Wertspalten geben, aber alle sollten in die gleichnamige Spalte mappen. Beispiel Ausgabe:

id value_A value_B value_C value1_A value1_B value1_C 
1  1   2   3  1   2   3 
2  1   2   3  1   2   3 

Antwort

0

Hier ist eine Option mit cSplit/dcast. Teilen Sie die Zeilen in ‚langen‘ Format mit cSplit und dcast es zu ‚breit‘ Format

library(splitstackshape) 
dcast(cSplit(df, c('name','value'), '~', 'long')[!is.na(value)], id ~ paste0('value_', name)) 
# id value_A value_B value_C value_D 
#1: 1  1  2  3  NA 
#2: 2  1  NA  NA  2 
+0

Wenn ich sagen kann, ich habe eine value1 und value2 Spalten. Welche Änderungen kann ich an dem "Cast" vornehmen, damit er die Werte darstellen kann? Ich weiß, dass ich 'cSplit (df, c ('Name', 'Wert1', 'Wert2'), '~', 'lang')' verwenden kann, um die 3 Spalten zu teilen. – kaexch

2

können Sie versuchen, dplyr:

library(tidyverse) 
df %>% 
separate_rows(name, value, sep = "~") %>% 
spread(name, value) 
    id A B C D 
1 1 1 2 3 <NA> 
2 2 1 <NA> 2 

Statt NA können Sie leere Zellen füllen, indem sie alles, was Sie innerhalb fill = ""

Oder baseR und reshape2 angeben:

a <- strsplit(as.character(df$name), "~") 
b <- strsplit(as.character(df$value), "~") 
df2 <- do.call(rbind.data.frame, Map(cbind, df$id, a, b)) 
library(reshape2) 
dcast(df2, V1~V2, value.var = "V3") 
    A B C D 
1 1 2 3 <NA> 
2 1 <NA> 2 
+0

Gibt es eine Möglichkeit Wert_ (die ursprüngliche Spaltenname) in jede der Spalten anhängen? – kaexch

+0

tray, um dies im ersten Beispiel hinzuzufügen 'select (id, value_A = A, value_B = B, value_C = C, value_D = D)' oder benenne das resultierende data.frame um (zum Beispiel in die Variable 'df1' gespeichert) Spaltennamen (df1) [- 1] <- paste0 ("Wert_", Spaltennamen (df1) [- 1]) ' – Jimbou

Verwandte Themen