Разделите каждую строку фрейма данных на вектор в R

Я пытаюсь разделить каждое число в фрейме данных с 16 столбцами на определенное число для каждого столбца. Числа хранятся в виде фрейма данных с 1-16, соответствующими выборкам в больших столбцах фреймов данных 1-16. Есть одно число на столбец, которое мне нужно разделить на каждое число в большой таблице и распечатать вывод в окончательную таблицу.

вот и пример того, с чего я начинаю. Таблицы должны быть разделенный.

            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

числа, чтобы разделить электронную таблицу на

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

и ожидаемые результаты, не обязательно округленные, как я сделал здесь.

    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

Я попытался просто разделить фреймы данных mx2 = mx / sf с mx, являющимся большим набором данных, а sf-фреймом данных чисел для деления. Это, казалось, делило все на первое число в наборе данных sf.

числа для деления были сгенерированы estimateSizeFactors, частью пакет DESeq, если это поможет.

любая помощь будет большое. Спасибо!

4 ответов


sweep полезно для таких операций. Например, некоторые фиктивные данные, где мы делим каждый элемент в соответствующих столбцах матрицы mat по соответствующему значению в векторе vec:

mat <- matrix(1:25, ncol = 5)
vec <- seq(2, by = 2, length = 5)

sweep(mat, 2, vec, `/`)

В настоящее время у нас есть:

> 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

как раз для разнообразия, вы смогли также использовать 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

но для этого я думаю, что ответ Джоша лучше... а у Гэвина еще лучше!


Это не что иное, как умножение матрицы по элементам:

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

для этого мы использовали подход к внешнему продукту, так как непосредственно пытается mat %*% 1/vec выдает ошибку non-conformable arguments потому что они имеют разную форму. Или посмотрите на многие сообщения на https://stackoverflow.com/search?q=%5Br%5D + умножить + матрицу+на + вектор


можно использовать 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
)

совсем немного для ввода с 16 столбцами, но он должен работать.