在多行中减去一行值
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]))
我有一个数据集可以简化为这样的东西,我们称该数据集为 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]))