将每个数据帧行除以R中的向量
我试图将16列数据框中的每个数字除以每列的特定数字。数字存储为数据帧,1-16对应于较大数据帧列1-16中的样本。每列有一个数字,我需要除以较大电子表格中的每个数字,然后将输出打印到最终电子表格中 下面是我开始讲的一个例子。要划分的电子表格将每个数据帧行除以R中的向量,r,vector,dataframe,divide,R,Vector,Dataframe,Divide,我试图将16列数据框中的每个数字除以每列的特定数字。数字存储为数据帧,1-16对应于较大数据帧列1-16中的样本。每列有一个数字,我需要除以较大电子表格中的每个数字,然后将输出打印到最终电子表格中 下面是我开始讲的一个例子。要划分的电子表格 X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2 1/2-SBSRNA4 4 2 2
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
1/2-SBSRNA4 4 2 2 6 7 6
A1BG 93 73 88 86 58 65
A1BG-AS1 123 103 96 128 46 57
要将电子表格除以的数字
X131.478.1 1.0660880
X131.478.2 0.9104053
X131.NSC.1 0.8642545
X131.NSC.2 0.9611866
X166.478.1 0.9711406
X166.478.2 1.0560121
预期的结果,不一定像我在这里做的那样四舍五入
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
1/2-SBSRNA4 3.75 2.19 2.31 6.24 7.20 5.68
A1BG 87.23 80.17 101.82 89.47 59.72 61.55
A1BG-AS1 115.37 113.13 111.07 133.16 47.36 53.97
我尝试简单地划分数据帧mx2=mx/sf,mx是大数据集,sf是要除以的数字的数据帧。这似乎将所有数据除以sf数据集中的第一个数字
除法的数字是由estimateSizeFactors生成的,如果有帮助的话,它是DESeq包的一部分
任何帮助都会很好。谢谢 您可以使用
transform
mx2 <- transform(mx,
X131.478.1=X131.478.1/sf["X131.478.1",1],
X131.478.2=X131.478.2/sf["X131.478.2",1],
etc
)
mx2仅为了多样性,您还可以使用mapply
mx <- structure(list(X131.478.1 = c(4L, 93L, 123L), X131.478.2 = c(2L,
73L, 103L), X131.NSC.1 = c(2L, 88L, 96L), X131.NSC.2 = c(6L,
86L, 128L), X166.478.1 = c(7L, 58L, 46L), X166.478.2 = c(6L,
65L, 57L)), .Names = c("X131.478.1", "X131.478.2", "X131.NSC.1",
"X131.NSC.2", "X166.478.1", "X166.478.2"), class = "data.frame", row.names = c("1/2-SBSRNA4",
"A1BG", "A1BG-AS1"))
sf <- structure(list(V1 = c(1.066088, 0.9104053, 0.8642545, 0.9611866,
0.9711406, 1.0560121)), .Names = "V1", row.names = c("X131.478.1",
"X131.478.2", "X131.NSC.1", "X131.NSC.2", "X166.478.1", "X166.478.2"
), class = "data.frame")
mapply(function(x, y) x * y, mx, t(sf))
X131.478.1 X131.478.2 X131.NSC.1 X131.NSC.2 X166.478.1 X166.478.2
[1,] 4.264352 1.820811 1.728509 5.76712 6.797984 6.336073
[2,] 99.146184 66.459587 76.054396 82.66205 56.326155 68.640787
[3,] 131.128824 93.771746 82.968432 123.03188 44.672468 60.192690
mxsweep
对于这些类型的操作很有用,但它需要一个矩阵作为输入。同样地,将数据帧转换为矩阵,执行该操作,然后再转换回矩阵。例如,一些虚拟数据,其中我们将矩阵mat
的各个列中的每个元素除以向量vec
中的相应值:
mat <- matrix(1:25, ncol = 5)
vec <- seq(2, by = 2, length = 5)
sweep(mat, 2, vec, `/`)
> vec <- df[1,]
> vec
a b c
1 1 3 100
要从数据帧进行转换,请使用as.matrix(df)
或data.matrix(df)
,并使用as.data.frame(mat)
进行反向转换。这只是元素矩阵乘法:
mat <- matrix(c(4,2,2,6,7,6, 93,73,88,86,58,65, 123,103,96,128,46,57), nrow=3, byrow=T)
vec = c(1.0660880,0.9104053,0.8642545,0.9611866,0.9711406,1.0560121)
mat %o% 1/vec
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3.752035 2.080761 1.876018 6.242284 6.566062 6.242284
[2,] 102.152305 75.169342 96.660246 88.555663 63.707889 66.931606
[3,] 142.319190 97.536761 111.078392 121.210732 53.225063 53.976654
mat假设我们有一个数据帧,df
:
> df
a b c
1 1 3 100
2 2 4 110
我们想用相同的向量除以每一行,vec
:
mat <- matrix(1:25, ncol = 5)
vec <- seq(2, by = 2, length = 5)
sweep(mat, 2, vec, `/`)
> vec <- df[1,]
> vec
a b c
1 1 3 100
这只是向量的矩阵乘法;看我的答案,这只是一个向量的矩阵乘法;请看我的答案。这不适用于数据帧,而这正是问题所要求的。@Bowecho将这些运算转换为矩阵非常简单,而且确实需要,因为对数据帧执行类似操作的速度很慢。您的输出与OP的预期输出不匹配。@oshun:没错,这是元素乘法(/division)。我必须使%*%
方法起作用。