2016-07-01 5 views
1

Ich habe eine data.frame mit key/value string Spalte mit Informationen über Features und ihre Werte für eine Reihe von Benutzern. So etwas wie das:R: Wie wandelt man einen Schlüssel/Wert-String in separate Spalten um?

data<-data.frame(id=1:3,statid=c("s003e","s093u","s085t"),str=c("a:1,7:2","a:1,c:4","a:3,b:5,c:33")) 
data 
# id statid   str 
# 1 1 s003e  a:1,7:2 
# 2 2 s093u  a:1,c:4 
# 3 3 s085t a:3,b:5,c:33 

Was ich versuche zu tun ist, eine data.frame-Spalte für jede Funktion zu erstellen. Wie folgt aus:

data_after<-data.frame(id=1:3,statid=c("s003e","s093u","s085t"), 
        a=c(1,1,3),b=c(0,0,5),c=c(0,4,33),"7"=c(2,0,0)) 
data_after 
# id statid a b c X7 
# 1 1 s003e 1 0 0 2 
# 2 2 s093u 1 0 4 0 
# 3 3 s085t 3 5 33 0 

Ich versuche str_split von stringr Paket zu verwenden und dann Elemente der erstellten Liste Transformation data.frames (später bindet sich zum Beispiel unter Verwendung von rbind.fill von plyr), kann es aber nicht getan. Jede Hilfe wird geschätzt!

+1

Siehe 'splitstackshape' Paket. – zx8754

Antwort

2

können Sie verwenden dplyr und tidyr:

library(dplyr); library(tidyr) 
data %>% mutate(str = strsplit(str, ",")) %>% unnest(str) %>% 
     separate(str, into = c('var', 'val'), sep = ":") %>% spread(var, val, fill = 0) 

# id statid 7 a b c 
# 1 1 s003e 2 1 0 0 
# 2 2 s093u 0 1 0 4 
# 3 3 s085t 0 3 5 33 
2

Wir cSplit verwenden kann dies in einer sauberen Art und Weise zu tun. Konvertieren Sie die Daten zu ‚langen‘ Format durch Spaltung bei ,, dann tun die Spaltung bei : und dcast von ‚long‘ auf ‚breit‘

library(splitstackshape) 
library(data.table) 
dcast(cSplit(cSplit(data, "str", ",", "long"), "str", ":"), 
        id+statid~str_1, value.var="str_2", fill = 0) 
# id statid 7 a b c 
#1: 1 s003e 2 1 0 0 
#2: 2 s093u 0 1 0 4 
#3: 3 s085t 0 3 5 33 
Verwandte Themen