2016-11-01 3 views
0

Ich habe eine data.table mit mehreren Variablen, die eine begrenzte Anzahl von Werten annehmen. Für jede Variable möchte ich eine Tabelle erstellen, die den Bruchteil der Beobachtungen mit jedem Wert mit Gruppierung zählt.Verwendung von mit = FALSE und .SD zu Teilmengen von .SD

Beispieldaten:

data = data.table(group = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), 
        Var1 = c(1,1,2,2,3,1,2,3,2,2,3,1,2,3,1), 
        Var2 = c(1,1,2,3,2,2,2,2,1,2,3,2,1,1,3)) 

Ich möchte zwei resultierenden Tabellen:

Var1: 
group | Var1_1 | Var1_2 | Var1_3 
------|---------|---------|--------- 
1  | .4  | .4  | .2 
2  | .2  | .6  | .2 
3  | .4  | .2  | .4 

und in ähnlicher Weise für Var2. Dies ist für eine einzelne Variable einfach:

data[, .(Var1_1 = .SD[Var1 == 1, .N]/.N, 
     Var1_2 = .SD[Var1 == 2, .N]/.N, 
     Var1_3 = .SD[Var1 == 3, .N]/.N), by = group, .SDcols = "Var1"] 

Aber da ich viele Variablen habe, möchte ich dies in einer Schleife tun. Ich habe mit der Verwendung von with = FALSE sowohl im äußeren Anruf als auch im .SD Anruf herum gespielt, aber war nicht in der Lage, es richtig zu machen. Idealerweise kann ich den Spaltennamen an .SDi Subset, .SDcols, und idealerweise als ein Argument an paste0() übergeben, um die Namen der Ausgabevariablen zu erstellen (z. B. paste0(varName, "_1")).

variables <- c("Var1", "Var2") 
for(variable in variables) { 
    data[...what should go here?...] 
} 

Irgendwelche Vorschläge, wie man das macht?

Antwort

1

table und prop.table sind in der Regel praktisch für den Aufbau solcher Proportional-Tabellen.

lapply(variables, function(var) data[, prop.table(table(group, get(var)), margin = 1)]) 

#[[1]] 

#group 1 2 3 
# 1 0.4 0.4 0.2 
# 2 0.2 0.6 0.2 
# 3 0.4 0.2 0.4 

#[[2]] 

#group 1 2 3 
# 1 0.4 0.4 0.2 
# 2 0.2 0.8 0.0 
# 3 0.4 0.2 0.4 
2

Wir können dies auch von data.table mit dcast tun

lapply(variables, function(x) dcast(data[, .N , c('group', x)][, 
    Perc := N/sum(N), group][, N := NULL], group~..., value.var = "Perc", fill = 0)) 
#[[1]] 
# group 1 2 3 
#1:  1 0.4 0.4 0.2 
#2:  2 0.2 0.6 0.2 
#3:  3 0.4 0.2 0.4 

#[[2]] 
# group 1 2 3 
#1:  1 0.4 0.4 0.2 
#2:  2 0.2 0.8 0.0 
#3:  3 0.4 0.2 0.4