基于因子唯一值的R中的嵌套循环

基于因子唯一值的R中的嵌套循环

问题描述:

我正在处理包含因子变量以及一些数值变量的数据集。我想为数字变量创建一系列散点图,比较数字因子的每个可能的配对。所以如果因子变量有4个唯一值(A,B,C,D);我的脚本将产生5个样本进行比较(A & B,A & C,A & D,B & C,B & D,C & D)。哪个变量位于散点图中的哪个轴上并不重要。基于因子唯一值的R中的嵌套循环

这里是我打算如何处理我的数据:

df = read.table("filename", sep="\t", header=TRUE) 
samples1 = unique(df$Sample_ID) 
s.len = length(samples1) 
samples2 = samples1[2:s.len] 

这给我留下了两个有序列表,我可以通过使用类似的东西循环:

FOREACH (samples1) { 
    df1 = df[df$Sample_ID == "samples1", ] 
    FOREACH (sample2) { 
    df2 = df[df$Sample_ID == "samples2", ] 
    plot(df1$count, df2$count) 
} 
} 

注意,上面的代码是没有功能

我想有一种方法可以通过使用apply()或其他一些更合适的函数来编写此代码的功能版本,但我不知道如何执行d它。我也有一种感觉,认为在循环的每次迭代中创建新的数据帧可能是一种更有效的方法;也许有一些已经存在的函数用于从一个可能授予我一个列表的因子中提取每个唯一对,并且可以通过单个循环获得相同结果的选项?

+2

也许'pairs'功能。见http://www.r-bloggers.com/scatterplot-matrices-in-r/ – fishtank

+0

你为什么不比较C和D? – Heroka

+1

这听起来像你可能有独立的样本,这意味着数据不会在例如(A,B)对中生成。如果那是真的,我不认为散点图会有任何意义。您可能需要一个boxplot来比较分配的变化。 –

下面是一个没有使用for-loop的方法,使用base-R函数'combn'。它使用原始数据的子集,而不需要创建新的数据框。绘图调用还管理轴和标题标题。

#generate some data 
set.seed(123) 
dat <- data.frame(
    count = rbinom(100,5,0.5), 
    sample = LETTERS[1:4], 
    stringsAsFactors = F 
) 

#get combinations 
my_combs <- combn(unique(dat$sample),2) 
# > my_combs 
# [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "A" "A" "A" "B" "B" "C" 
# [2,] "B" "C" "D" "C" "D" "D" 


par(mfrow = c(3,2)) 
#plot 
apply(my_combs, 2,function(x) { 
    plot(
    dat[dat$sample == x[1],"count"], dat[dat$sample == x[2], "count"], 
    xlab = x[1],ylab = x[2], main = sprintf("scatterplot of %s and %s",x[1],x[2]) 
) 
}) 

enter image description here