superponer - Divide cada fila de cuadros de datos por vector en R
superponer graficas en r (4)
Estoy tratando de dividir cada número dentro de un marco de datos con 16 columnas por un número específico para cada columna. Los números se almacenan como un marco de datos con 1-16 correspondiente a las muestras en las columnas de datos más grandes 1-16. Hay un número único por columna que necesito dividir por cada número en la hoja de cálculo más grande e imprimir el resultado en una hoja de cálculo final.
Aquí está y un ejemplo de lo que estoy empezando. La hoja de cálculo a dividir.
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
1/2-SBSRNA4 4 2 2 6 7 6
A1BG 93 73 88 86 58 65
A1BG-AS1 123 103 96 128 46 57
Los números para dividir la hoja de cálculo por.
X131.478.1 1.0660880
X131.478.2 0.9104053
X131.NSC.1 0.8642545
X131.NSC.2 0.9611866
X166.478.1 0.9711406
X166.478.2 1.0560121
Y los resultados esperados, no necesariamente redondeados como lo hice aquí.
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
1/2-SBSRNA4 3.75 2.19 2.31 6.24 7.20 5.68
A1BG 87.23 80.17 101.82 89.47 59.72 61.55
A1BG-AS1 115.37 113.13 111.07 133.16 47.36 53.97
Intenté simplemente dividir los marcos de datos mx2 = mx / sf, siendo mx el gran conjunto de datos y sf el marco de datos de los números a dividir por. Eso pareció dividir todo por el primer número en el conjunto de datos de sf.
Los números para la división fueron generados porestimSizeFactors, parte del paquete DESeq si eso ayuda.
Cualquier ayuda sería genial. ¡Gracias!
Esto no es más que una multiplicación de matrices de elementos :
mat <- matrix(c(4,2,2,6,7,6, 93,73,88,86,58,65, 123,103,96,128,46,57), nrow=3, byrow=T)
vec = c(1.0660880,0.9104053,0.8642545,0.9611866,0.9711406,1.0560121)
mat %o% 1/vec
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3.752035 2.080761 1.876018 6.242284 6.566062 6.242284
[2,] 102.152305 75.169342 96.660246 88.555663 63.707889 66.931606
[3,] 142.319190 97.536761 111.078392 121.210732 53.225063 53.976654
Para hacer eso, utilizamos el enfoque del producto externo , ya que tratar directamente mat %*% 1/vec
da un error en non-conformable arguments
porque tienen formas diferentes. O mira las muchas publicaciones en https://.com/search?q=%5Br%5D+multiply+matrix+by+vector
Podrías usar transform
mx2 <- transform(mx,
X131.478.1=X131.478.1/sf["X131.478.1",1],
X131.478.2=X131.478.2/sf["X131.478.2",1],
etc
)
Bastante un poco para escribir con 16 columnas, pero debería funcionar.
Solo por variedad, también mapply
usar mapply
mx <- structure(list(X131.478.1 = c(4L, 93L, 123L), X131.478.2 = c(2L,
73L, 103L), X131.NSC.1 = c(2L, 88L, 96L), X131.NSC.2 = c(6L,
86L, 128L), X166.478.1 = c(7L, 58L, 46L), X166.478.2 = c(6L,
65L, 57L)), .Names = c("X131.478.1", "X131.478.2", "X131.NSC.1",
"X131.NSC.2", "X166.478.1", "X166.478.2"), class = "data.frame", row.names = c("1/2-SBSRNA4",
"A1BG", "A1BG-AS1"))
sf <- structure(list(V1 = c(1.066088, 0.9104053, 0.8642545, 0.9611866,
0.9711406, 1.0560121)), .Names = "V1", row.names = c("X131.478.1",
"X131.478.2", "X131.NSC.1", "X131.NSC.2", "X166.478.1", "X166.478.2"
), class = "data.frame")
mapply(function(x, y) x * y, mx, t(sf))
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
[1,] 4.264352 1.820811 1.728509 5.76712 6.797984 6.336073
[2,] 99.146184 66.459587 76.054396 82.66205 56.326155 68.640787
[3,] 131.128824 93.771746 82.968432 123.03188 44.672468 60.192690
Pero para esto creo que la respuesta de Josh es mejor ... ¡y Gavin es aún mejor!
sweep
es útil para este tipo de operaciones. Por ejemplo, algunos datos ficticios donde dividimos cada elemento en las columnas respectivas de la matriz matricial por el valor correspondiente en el vector vec
:
mat <- matrix(1:25, ncol = 5)
vec <- seq(2, by = 2, length = 5)
sweep(mat, 2, vec, `/`)
En uso tenemos:
> mat
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> vec
[1] 2 4 6 8 10
> sweep(mat, 2, vec, `/`)
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5 1.50 1.833333 2.000 2.1
[2,] 1.0 1.75 2.000000 2.125 2.2
[3,] 1.5 2.00 2.166667 2.250 2.3
[4,] 2.0 2.25 2.333333 2.375 2.4
[5,] 2.5 2.50 2.500000 2.500 2.5
> mat[,1] / vec[1]
[1] 0.5 1.0 1.5 2.0 2.5