2016-06-17 22 views
2

Ich habe einen Datenrahmen von Artikel Listen, wobei jede Zeile im Datenrahmen LHS und RHS Assoziationsregeln mit der entsprechenden Unterstützung, Vertrauen und Aufzug enthalten. hier die Daten:R Artikel Listen zu Wide Format

structure(list(rules = structure(c(13L, 4L, 28L, 1L, 24L, 15L 
), .Label = c("{butter,jam} => {whole milk}", "{butter,rice} => {whole milk}", 
"{canned fish,hygiene articles} => {whole milk}", "{curd,cereals} => {whole milk}", 
"{domestic eggs,rice} => {whole milk}", "{grapes,onions} => {other vegetables}", 
"{hamburger meat,bottled beer} => {whole milk}", "{hamburger meat,curd} => {whole milk}", 
"{hard cheese,oil} => {other vegetables}", "{herbs,fruit/vegetable juice} => {other vegetables}", 
"{herbs,rolls/buns} => {whole milk}", "{herbs,shopping bags} => {other vegetables}", 
"{liquor,red/blush wine} => {bottled beer}", "{meat,margarine} => {other vegetables}", 
"{napkins,house keeping products} => {whole milk}", "{oil,mustard} => {whole milk}", 
"{onions,butter milk} => {other vegetables}", "{onions,waffles} => {other vegetables}", 
"{pastry,sweet spreads} => {whole milk}", "{pickled vegetables,chocolate} => {whole milk}", 
"{pork,butter milk} => {other vegetables}", "{rice,bottled water} => {whole milk}", 
"{rice,sugar} => {whole milk}", "{soups,bottled beer} => {whole milk}", 
"{tropical fruit,herbs} => {whole milk}", "{turkey,curd} => {other vegetables}", 
"{whipped/sour cream,house keeping products} => {whole milk}", 
"{yogurt,cereals} => {whole milk}", "{yogurt,rice} => {other vegetables}" 
), class = "factor"), support = c(0.00193187595322827, 0.00101677681748856, 
0.00172852058973055, 0.00101677681748856, 0.00111845449923742, 
0.00132180986273513), confidence = c(0.904761904761905, 0.909090909090909, 
0.80952380952381, 0.833333333333333, 0.916666666666667, 0.8125 
), lift = c(11.2352693602694, 3.55786275006331, 3.16819206791352, 
3.26137418755803, 3.58751160631383, 3.17983983286908)), .Names = c("rules", 
"support", "confidence", "lift"), row.names = c(NA, 6L), class = "data.frame") 

Was ich brauche, ist diese Regeln in einem breiten Format zu strukturieren, wobei für jedes Element in jedem LHS Teil der Regeln eine bestimmte Spalte mit einem Wert von 1 haben (um anzuzeigen, dass Regel hat dieses Element in seinem LHD-Teil), das gleiche gilt für die RHS der Regeln, z die 2 ersten Regeln unter:

{liquor,red/blush wine} => {bottled beer} 0.0019 0.90 11.2 
{curd,cereals} => {whole milk} 0.0010 0.91 3.6 

Das Ergebnis sollte ein Datenrahmen, die wie folgt aussieht:

'rules_id' 'lhs_liquor' 'lhs_red/blush wine' 'lhs_curd' 'lhs_cereals' 'rhs_bottled beer' 'rhd_whole milk' 'support' 'confidence' 'lift' 
1 1 1 0 0 1 0 0.0019 0.90 11.2 
2 0 0 1 1 0 1 0.0010 0.91 3.6 

Wie ich lass es mich Überlauf bin neu in R und stapeln wissen, ob die Frage nicht gut ist definiert Jede Hilfe

geschätzt
+0

Ihr letzter Absatz, da sie nicht Teil der Frage selbst ist, würde in der Regel hier nach unten gehen, in den Kommentaren. – Frank

+0

Ein langes Format wäre wahrscheinlich nützlicher: 'df%>% \t getrennt (col = Regeln, in = c ('lhs', 'rhs'), sep = '=>')%>% \t seperate_rows (col = lhs, in = lhs, sep = ',')%>% \t sammeln (key = seite, wert = produkt, lhs, rhs)%>% \t mutieren (product = gsub ('[{}]' , '', Produkt)) ' – alistaire

Antwort

0

Sie können dies tun.

dummies <- function(x, prefix) { 
    x.names <- unique(unlist(strsplit(x, ','))) 
    out <- array(0L, c(nrow(df), length(x.names)), list(NULL, x.names)) 
    mapply(function(i, val) out[i, val] <<- 1L, 1:nrow(out), strsplit(x, ',')) 
    if (!missing(prefix)) 
     colnames(out) <- paste0(prefix, colnames(out)) 
    out 
} 

pat <- '[{](.*)[}] => [{](.*)[}]' 

cbind(as.data.frame(
    cbind(dummies(sub(pat, '\\1', df$rules), 'lhs.'), 
      dummies(sub(pat, '\\2', df$rules), 'rhs.'))), 
    df[c('support','confidence','lift')]) 

Ausgabe wie folgt:

lhs.liquor lhs.red/blush wine lhs.curd lhs.cereals lhs.yogurt lhs.butter 
1   1     1  0   0   0   0 
2   0     0  1   1   0   0 
3   0     0  0   1   1   0 
4   0     0  0   0   0   1 
5   0     0  0   0   0   0 
6   0     0  0   0   0   0 
    lhs.jam lhs.soups lhs.bottled beer lhs.napkins lhs.house keeping products 
1  0   0    0   0       0 
2  0   0    0   0       0 
3  0   0    0   0       0 
4  1   0    0   0       0 
5  0   1    1   0       0 
6  0   0    0   1       1 
    rhs.bottled beer rhs.whole milk  support confidence  lift 
1    1    0 0.001931876 0.9047619 11.235269 
2    0    1 0.001016777 0.9090909 3.557863 
3    0    1 0.001728521 0.8095238 3.168192 
4    0    1 0.001016777 0.8333333 3.261374 
5    0    1 0.001118454 0.9166667 3.587512 
6    0    1 0.001321810 0.8125000 3.179840 
+0

Super! sehr saubere Lösung. Es ist ein wenig außerhalb meiner Liga, dies zu verstehen und mapply Aussagen, so würde ich mich freuen, wenn Sie erklären könnten, was dort los ist, danke trotzdem –

+0

@NirRegev Eigentlich ist diese Lösung ein wenig hacky. Erstes Problem: 'Dummies' haben einen fest codierten Verweis auf' df'. Die Verwendung von 'mapply' emuliert hier' enumerate() 'in Python, wobei man über die Elemente von' 1: nrow (out) 'und' strsplit (x, ',') 'iteriert. Außerdem wird der Operator '<< - verwendet, um eine Zuweisung außerhalb des Bereichs der anonymen Funktion vorzunehmen. –

0

Sie etwas tun könnte, wie

library(dplyr) 
library(tidyr) 
library(reshape2) 
rules %>% 
    mutate(id = seq_len(n())) %>% 
    separate(rules, c("lhs", "rhs"), "\\} => \\{") %>% 
    separate_rows(lhs) %>% filter(lhs!="") %>% 
    gather(value, var, lhs, rhs) %>% 
    mutate(var=paste(value, sub("}", "", var, fixed=T), sep="_")) %>% 
    dcast(id+support+confidence+lift~var, fun.aggregate = function(x) (length(x)>0)+0L) 
# id  support confidence  lift lhs_beer lhs_blush lhs_bottled lhs_butter lhs_cereals 
# 1 1 0.001931876 0.9047619 11.235269  0   1   0   0   0 
# 2 2 0.001016777 0.9090909 3.557863  0   0   0   0   1 
# 3 3 0.001728521 0.8095238 3.168192  0   0   0   0   1 
# 4 4 0.001016777 0.8333333 3.261374  0   0   0   1   0 
# 5 5 0.001118454 0.9166667 3.587512  1   0   1   0   0 
# 6 6 0.001321810 0.8125000 3.179840  0   0   0   0   0 
# lhs_curd lhs_house lhs_jam lhs_keeping lhs_liquor lhs_napkins lhs_products lhs_red 
# 1  0   0  0   0   1   0   0  1 
# 2  1   0  0   0   0   0   0  0 
# 3  0   0  0   0   0   0   0  0 
# 4  0   0  1   0   0   0   0  0 
# 5  0   0  0   0   0   0   0  0 
# 6  0   1  0   1   0   1   1  0 
# lhs_soups lhs_wine lhs_yogurt rhs_bottled beer rhs_whole milk 
# 1   0  1   0    1    0 
# 2   0  0   0    0    1 
# 3   0  0   1    0    1 
# 4   0  0   0    0    1 
# 5   1  0   0    0    1 
# 6   0  0   0    0    1 

Fühlen Sie sich frei, tidyrs spread anstelle von reshape2 dcast zu verwenden - ich finde noch dcast mehr untuitive ...

+0

seperate_rows() ist eine unbekannte Funktion. Ich frage mich, zu welchem ​​Paket diese Funktion gehört? –

+0

Sie müssen 'tidyr' aktualisieren. – lukeA