Lassen Sie uns sagen, ich habe diese data.table (Ist-Daten 25061 x 5862 ist):Mit data.table berechnen: Wie viele 2x2 nicht-NA-Werte gibt es unter den Variablen?
require(data.table)
df
# gene P1 P2 P3 P4 P5
# 1: gene1 0.111 0.319 0.151 NA -0.397
# 2: gene10 1.627 2.252 1.462 -1.339 -0.644
# 3: gene2 -1.766 -0.056 -0.369 1.910 0.981
# 4: gene3 -1.346 1.283 0.322 -0.465 0.403
# 5: gene4 -0.783 NA -0.005 1.761 0.066
# 6: gene5 0.386 -0.309 -0.886 -0.072 0.161
# 7: gene6 0.547 -0.144 -0.725 -0.133 1.059
# 8: gene7 0.785 -1.827 0.986 1.555 -0.798
# 9: gene8 -0.186 NA 0.401 0.900 -1.075
# 10: gene9 -0.177 1.497 -1.370 -1.628 -1.044
ich, wie wissen möchten, die Vorteile der data.table Struktur machen, die ich für jede effizient berechnen kann, Paar von Genwerten, wie viele Paare gibt es ohne NA. Zum Beispiel für das Paar gene1, gene2, würde ich das Ergebnis gefällt 4.
Mit Base R zu sein, tun es ich auf diese Weise:
calc_nonNA <- !is.na(df[, -1, with=F])
Effectifs <- calc_nonNA %*% t(calc_nonNA)
# or, as suggested by @DavidArenburg and @Khashaa, more efficiently:
Effectifs <- tcrossprod(calc_nonNA)
Aber mit einem großen df, dauert es Stunden ...
Meine gewünschte Ausgabe, mit dem bereitgestellten Beispiel ist dies:
gene1 gene10 gene2 gene3 gene4 gene5 gene6 gene7 gene8 gene9
gene1 4 4 4 4 3 4 4 4 3 4
gene10 4 5 5 5 4 5 5 5 4 5
gene2 4 5 5 5 4 5 5 5 4 5
gene3 4 5 5 5 4 5 5 5 4 5
gene4 3 4 4 4 4 4 4 4 4 4
gene5 4 5 5 5 4 5 5 5 4 5
gene6 4 5 5 5 4 5 5 5 4 5
gene7 4 5 5 5 4 5 5 5 4 5
gene8 3 4 4 4 4 4 4 4 4 4
gene9 4 5 5 5 4 5 5 5 4 5
Daten
df <- structure(list(gene = c("gene1", "gene10", "gene2", "gene3",
"gene4", "gene5", "gene6", "gene7", "gene8", "gene9"), P1 = c(0.111,
1.627, -1.766, -1.346, -0.783, 0.386, 0.547, 0.785, -0.186, -0.177
), P2 = c(0.319, 2.252, -0.056, 1.283, NA, -0.309, -0.144, -1.827,
NA, 1.497), P3 = c(0.151, 1.462, -0.369, 0.322, -0.005, -0.886,
-0.725, 0.986, 0.401, -1.37), P4 = c(NA, -1.339, 1.91, -0.465,
1.761, -0.072, -0.133, 1.555, 0.9, -1.628), P5 = c(-0.397, -0.644,
0.981, 0.403, 0.066, 0.161, 1.059, -0.798, -1.075, -1.044)), .Names = c("gene",
"P1", "P2", "P3", "P4", "P5"), class = c("data.table", "data.frame"
), row.names = c(NA, -10L), .internal.selfref = <pointer: 0x022524a0>)
'tcrossprod (x)' ist schneller als 'x% *% t (x)' – Khashaa
@Khashaa danke für die Anregung, sehr gute Sache zu wissen. Ich füge das als weitere Basisoption hinzu. Ich würde gerne wissen, ob eine data.table Lösung noch schneller sein kann. – Cath
Wie groß ist dein 'df'? – Khashaa