在多行中减去一行值

Subtract a row of values across many rows

我有一个数据集可以简化为这样的东西,我们称该数据集为 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)]} 

None 其中可行。第一个告诉我 "replacement element 1 is a matrix/data of 1 row, need 3"。第二个告诉我 "STATS is longer than the extent of 'dim(x)[MARGIN]'",将 margin 更改为 2 并不能解决问题。第三个说“‘-’只为同样大小的数据帧定义”。第四个returns我一个空白矩阵

我已经尽我所能浏览了论坛,但他们仅限于在整个数据集中应用一个值,我想在其余行中减去一整行值一个数据集。

最终结果应如下所示(无需四舍五入)。

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

您可以从第二个数据帧的所有行中减去这一行,方法是重复一行的次数与第二个数据帧中的行数一样多,然后简单地减去这两个数据帧,如下所示。

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

我们可以使用 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

或使用转置

B[-1] <- t(t(B[-1]) - unlist(blank[-1]))