我有一个简化为这样的数据集,我们称该数据集为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
您可以通过重复第二行中第二行中所有行的次数,从第二行中的每一行中减去第一行,并像下面这样简单地减去这两行。
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