我认为这可能很容易解决,但我无法使其正常工作。这是针对R-shiny应用程序的,它具有两个结构如下的输入数据集:
d1 <- data.frame(A1 = rnorm(10),
A2 = rnorm(10),
A3 = rnorm(10),
B1 = rnorm(10),
B2 = rnorm(10),
B3 = rnorm(10),
C1 = rnorm(10),
C2 = rnorm(10),
C3 = rnorm(10),
Names = c("A", "B", "C", "D", "E",
"F", "G", "H", "I", "J"))
尽管此数据以表示同一样本重复项的逻辑方式构建,但并非在所有情况下都可以保证,并且输入因用户而异。因此,我提示输入索引以指示相关的列(即它们具有相同的名称),从而给出如下所示的数据框:
d2 <- data.frame(ID = c("A1", "A2", "A3",
"B1", "B2", "B3",
"C1", "C2", "C3"),
Anno = c(rep("A", 3),
rep("B", 3),
rep("C", 3)), stringsAsFactors = FALSE)
我可以使用散点图将每个样本与其他样本进行比较
plot_combinations = combn(names(d1)[1:ncol(d1)-1],
2,
simplify = FALSE)
plot_list <- list()
plot.col = "black"
for (i in 1:length(plot_combinations)) {
p = ggplot(d1,
aes_string(x = plot_combinations[[i]][1],
y = plot_combinations[[i]][2])) +
geom_point(pch = 21, colour = "black", fill = plot.col) +
theme_classic(base_size = 14)
plot_list[[i]] = p
}
虽然从原理上讲这是可行的,但是对于一个很小的数据集来说,已经是36种组合了。更有意义的是在复制中进行比较。为此,我可以重命名d1
的列,并获取每个复制的频率,并将其保存在变量sampleFreq
中,并通过如下遍历复制名称来提取数据:
anno <- d2$Anno
d3 <- d1[,1:nrow(d1)-1]
colnames(d3) <- anno
sampleFreq <- as.data.frame(table(d2[,2]))
datalist <- list()
for (i in sampleFreq[, 1]) {
d4 <- d3[, i == names(d3)]
datalist[[i]] = d4
}
这给了我一个由复制结构化的数据帧列表,我想据此创建一个散点图列表。我已经尝试过循环,但是遇到了问题,我认为对此可能有一个不合适的解决方案,但是我被困住了。然后,想法是使用索引号从图列表中调用图,该索引号由按闪亮按钮的次数决定。
任何帮助都会很棒
谢谢!
答案 0 :(得分:1)
每个复制组中的配对图不做什么?我们可以从您的数据开始,我尽量不要将d1中的列重命名为d3(就像您一样)
d1 <- data.frame(A1 = rnorm(10),
A2 = rnorm(10),
A3 = rnorm(10),
B1 = rnorm(10),
B2 = rnorm(10),
B3 = rnorm(10),
C1 = rnorm(10),
C2 = rnorm(10),
C3 = rnorm(10),
Names = c("A", "B", "C", "D", "E",
"F", "G", "H", "I", "J"))
d2 <- data.frame(ID = c("A1", "A2", "A3",
"B1", "B2", "B3",
"C1", "C2", "C3"),
Anno = c(rep("A", 3),
rep("B", 3),
rep("C", 3)), stringsAsFactors = FALSE)
我们经历了所有重复:
pdf(<somefilename.pdf>)
for(i in unique(d2$Anno)){
COLS=d2$ID[d2$Anno ==i]
pairs(d1[,COLS],upper.panel=NULL)
}
dev.off()
看起来像这样,但是(血腥)很快
或者您可以使用GGally,
library(GGally)
plots <- lapply(unique(d2$Anno),function(i){
COLS=as.character(d2$ID[d2$Anno ==i])
return(ggscatmat(d1[,d2$Anno %in% i]))
})
plots[[1]]