R中的行对计算
我想知道最好的方法 使用此格式R中的行对计算,r,R,我想知道最好的方法 使用此格式 gene Sample1 Sample2 Sample3 .... A 0 2 0 B 1 1 3 C 1.32 3.21 3.33 .... 因此 gene Sample1 Sample2 Sample3 .... A-B -1 1 -3 A-C -0.32 -2.21 -0.33 A-D ... B-C ... 给我一个建议。谢谢 数据太大,但我想快速处理 使用expand.grid()可以获得包含所有不同向量组合的数据帧。在本例中,您希望获得向
gene Sample1 Sample2 Sample3 ....
A 0 2 0
B 1 1 3
C 1.32 3.21 3.33
....
因此
gene Sample1 Sample2 Sample3 ....
A-B -1 1 -3
A-C -0.32 -2.21 -0.33
A-D
...
B-C
...
给我一个建议。谢谢
数据太大,但我想快速处理 使用expand.grid()
可以获得包含所有不同向量组合的数据帧。在本例中,您希望获得向量自身的每个组合。这段代码执行您想要执行的操作,但可能有一种更快的方法。对于N=1000,在我的机器上花费了7秒
set.seed(1)
N <- 5
d <- data.frame(gene = 1:N, sample.1 = sample(N), sample.2 = sample(N))
head(d)
gene sample.1 sample.2
1 1 2 5
2 2 5 4
3 3 4 2
4 4 3 3
5 5 1 1
df <- expand.grid(list(d$gene, d$gene))
df <- merge(df, d, by.x = "Var1", by.y = "gene")
df <- merge(df, d, by.x = "Var2", by.y = "gene")
df$gene.diff <- paste(df$Var1, "-", df$Var2)
df$sample.1.diff <- df$sample.1.x - df$sample.1.y
df$sample.2.diff <- df$sample.2.x - df$sample.2.y
# Only need one difference between each pair of genes:
df <- df[df$Var1 > df$Var2, ]
df <- df[, names(df) %in% c("gene.diff", grep("diff", names(df), value = TRUE))]
head(df, n = 8)
gene.diff sample.1.diff sample.2.diff
2 2 - 1 3 -1
3 3 - 1 2 -3
4 4 - 1 1 -2
5 5 - 1 -1 -4
8 3 - 2 -1 -2
9 4 - 2 -2 -1
10 5 - 2 -4 -3
14 4 - 3 -1 1
set.seed(1)
N此解决方案消除了合并
步骤,并更好地使用了矩阵算法
#reproducible example!
data <- data.frame(gene=LETTERS[1:3], Sample1=c(0,1,1.321),
Sample2 = c(2,1,3.21), Sample3=c(0,3,3.33))
# hooray for cartesian join
combos <- subset(merge(data,data,by=NULL, suffixes=c(".1",".2")), gene.1 != gene.2)
gene1_vals <- combos[,2:ncol(data)]
gene2_vals <- combos[,(ncol(data)+2):(2*ncol(data))]
gene_diff_txt <- paste(combos[,1], combos[,ncol(data)+1],sep="-")
gene_diffs <- data.frame(gene1_vals - gene2_vals)
names(gene_diffs) <- paste0("Sample",1:ncol(gene1_vals))
data.frame(gene=gene_diff_txt, gene_diffs)[order(combos$gene.1, combos$gene.2),]
# gene Sample1 Sample2 Sample3
# 4 A-B -1.000 1.00 -3.00
# 7 A-C -1.321 -1.21 -3.33
# 2 B-A 1.000 -1.00 3.00
# 8 B-C -0.321 -2.21 -0.33
# 3 C-A 1.321 1.21 3.33
# 6 C-B 0.321 2.21 0.33
#可复制的示例!
第#部分的数据在每对基因之间只需要一个差异:如果基因名不是数字,我能做什么?而不是d