Разделите каждую строку кадра данных вектором в 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.
Числа для деления были сгенерированы оценкойSizeFactors, частью пакета DESeq, если это помогает.
Любая помощь будет отличной. Спасибо!
Ответы
Ответ 1
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
Для преобразования из фрейма данных используйте as.matrix(df)
или data.matrix(df)
, а as.data.frame(mat)
для обратного.
Ответ 2
Предположим, у нас есть фрейм данных, df
:
> df
a b c
1 1 3 100
2 2 4 110
И мы хотим разделить каждую строку на один и тот же вектор, vec
:
> vec <- df[1,]
> vec
a b c
1 1 3 100
Тогда мы можем использовать mapply
следующим образом:
> mapply('/', df, vec)
a b c
[1,] 1 1.000000 1.0
[2,] 2 1.333333 1.1
Ответ 3
Просто для разнообразия вы также можете использовать 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
Но для этого я думаю, что Джош лучше ответил... и Гэвин еще лучше!
Ответ 4
Это ничего, кроме элементарного умножения матрицы:
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+multiply+matrix+by+vector
Ответ 5
Вы можете использовать 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 столбцов, но он должен работать.