将一行值减为多行

问题描述 投票:1回答:2

我有一个简化为这样的数据集,我们称该数据集为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
r rows subtraction
2个回答
0
投票

您可以通过重复第二行中第二行中所有行的次数,从第二行中的每一行中减去第一行,并像下面这样简单地减去这两行。

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

0
投票

我们可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.