2016-06-17 8 views
2

Ich frage mich, wie Ebenen Werte von Werten in data.table subtrahieren. Mein MWE ist unten angegeben. Jede Hilfe wird sehr geschätzt. Dankdata.table: Subtrahieren Ebenen bedeutet von Werten

set.seed(12345) 
A <- rep(x=paste0("A", 1:2), each=6) 
B <- rep(x=paste0("B", 1:3), each=2, times=2) 
Rep <- rep(x=1:2, times=3) 
Y <- rnorm(n=12, mean = 50, sd = 5) 

library(data.table) 
dt <- data.table(A, B, Rep, Y) 

dt[, j=mean(Y), by=.(A, B)] 
dt[, j=mean(Y), by=.(A)] 

dt[, j=mean(Y), by=.(A, B)] - dt[, j=mean(Y), by=.(A)] 

Error in Ops.data.frame(dt[, j = mean(Y), by = .(A, B)], dt[, j = mean(Y), : 
    ‘-’ only defined for equally-sized data frames 

Herausgegeben

Eigentlich möchte ich dieses

dt[, j=mean(Y), by=.(A, B)] - dt[, j=mean(Y), by=.(A)] - dt[, j=mean(Y), by=.(B)] + dt[, j=mean(Y)] 

Antwort

5

Der Grund, warum Sie die Fehlermeldung erhalten, ist die Dimension der beiden data.table Sie subtrahieren unterscheidet. Auf der anderen Seite können Sie eine verkettete Transformation tun data.table mit:

dt[, j := mean(Y), .(A, B)][, j := j - mean(Y), .(A)] 
dt 
    A B Rep  Y   j 
1: A1 B1 1 52.92764 3.6373822 
2: A1 B1 2 53.54733 3.6373822 
3: A1 B2 1 49.45348 -1.0071061 
4: A1 B2 2 47.73251 -1.0071061 
5: A1 B3 1 53.02944 -2.6302761 
6: A1 B3 2 40.91022 -2.6302761 
7: A2 B1 1 53.15049 0.1752053 
8: A2 B1 2 48.61908 0.1752053 
9: A2 B2 1 48.57920 -3.7182851 
10: A2 B2 2 45.40339 -3.7182851 
11: A2 B3 1 49.41876 3.5430798 
12: A2 B3 2 59.08656 3.5430798 

Für das Update können Sie tun:

dt[, j := mean(Y), .(A, B)][, j := j - mean(Y), .(A)][, j := j - mean(Y), .(B)][, j := j + mean(Y)] 
dt 
    A B Rep  Y   j 
1: A1 B1 1 52.92764 1.731088 
2: A1 B1 2 53.54733 1.731088 
3: A1 B2 1 49.45348 1.355590 
4: A1 B2 2 47.73251 1.355590 
5: A1 B3 1 53.02944 -3.086678 
6: A1 B3 2 40.91022 -3.086678 
7: A2 B1 1 53.15049 -1.731088 
8: A2 B1 2 48.61908 -1.731088 
9: A2 B2 1 48.57920 -1.355590 
10: A2 B2 2 45.40339 -1.355590 
11: A2 B3 1 49.41876 3.086678 
12: A2 B3 2 59.08656 3.086678 
+0

Dank @Psidom für deine Antwort. Ich frage mich, wie man komplizierte Berechnungen wie diese durchführt: dt [, j = mean (Y), by =. (A, B)] - dt [, j = mean (Y), by =. (A)] - dt [ , j = Mittelwert (Y), durch = (B)] + dt [, j = Mittelwert (Y)]. Danke – MYaseen208

+2

Ähnlich, wenn Sie alle Operationen zusammenführen, sollten Sie in der Lage sein zu bekommen, was Sie wollen. Wie z. B. 'dt [, j: = Mittel (Y), (A, B)] [, j: = j - Mittel (Y),. (A)] [, j: = j - Mittel (Y), . (B)] [, j: = j + mittel (Y)] '. – Psidom

+2

Hinweis: Das OP verwendet 'j' als benanntes Argument von' [.data.table', aber Sie erstellen tatsächlich eine Spalte mit dem Namen 'j' ... die einige (wie ich) verwirrend finden könnten. – Frank