Вычтите ряд значений из множества строк - PullRequest
3 голосов
/ 21 марта 2020

У меня есть набор данных, который упрощается до чего-то подобного, давайте назовем этот набор данных B

V1      V2 V3 V4
sample1 1  2  3
sample2 4  5  6 
sample3 7  8  9 

, тогда у меня будет другая отдельная строка (сама по себе) с именем blank, она будет выглядеть как-то вот так.

V1    V2  V3  V4
blank 0.5 1.0 1.5

Я бы хотел вычесть blank во все строки B. До сих пор я пытался:

B[,2:ncol(B)] <- lapply(B[,2:ncol(B)], function(x) x - blank[,2:ncol(blank)])

B[,2:ncol(B)] <- sweep(B[,2:ncol(B)], 1, blank[,2:ncol(blank)])

B[,2:ncol(B)] <- B[,2:ncol(B)] - blank[,2:ncol(blank)])

B[,2:ncol(B)] <- for(i in 1:nrow(B)){B[ i ,2:ncol(B)] - blank[,2:ncol(B)]} 

Ничего из этого не сработало бы. Первый говорит мне, что «заменяющий элемент 1 представляет собой матрицу / данные 1 строки, нужно 3». Второй говорит мне: «STATS длиннее, чем степень dim (x) [MARGIN]», изменение поля на 2 не решает проблему. Третий говорит, что «-» определен только для фреймов данных одинакового размера ». Четвертый возвращает мне пустую матрицу.

Я просмотрел форум в меру своих возможностей, но они ограничены применением только одного значения во всем наборе данных, я хотел бы вычесть целое ряд значений по остальным строкам набора данных.

Конечный результат должен выглядеть следующим образом (округление не требуется).

V1      V2  V3  V4
sample1 0.5 1.0 1.5
sample2 3.5 4.0 4.5
sample3 6.5 7.0 7.5

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Мы можем использовать sweep:

B[-1] <- sweep(B[-1], 2, unlist(blank[-1]), `-`)
B
#       V1  V2 V3  V4
#1 sample1 0.5  1 1.5
#2 sample2 3.5  4 4.5
#3 sample3 6.5  7 7.5

Или использовать transpose

B[-1] <- t(t(B[-1]) - unlist(blank[-1]))
1 голос
/ 21 марта 2020

Вы можете вычесть одну строку из всех строк второго кадра данных, повторяя одну строку столько раз, сколько строк во втором кадре данных, и просто вычитать эти два кадра данных, как показано ниже.

df1 <- t(data.frame(c(1,2,3), c(4,5,6), c(7,8,9)))
df2 <- data.frame(.5, 1, 1.5)
df1[,]-df2[rep(1,3),] # Note that inside the rep i am creating 3 rows if you have
#more rows you need to change 3 to number of rows you have
...