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

时间:2015-12-14 21:11:41

标签: r nested-loops

我正在使用包含因子变量以及一些数字变量的数据集。我想为数值变量创建一系列散点图,比较数值因子的每个可能的配对。因此,如果因子变量有4个唯一值(A,B,C,D);我的脚本将产生5点比较(A& B,A& C,A& D,B& C,B& D,C& D)。哪个变量位于散点图中的哪个轴上无关紧要。

以下是我打算处理数据的方式:

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()或其他更合适的函数来编写此代码的功能版本,但我不知道该怎么做。我还有一种感觉,可能有一种更有效的方法来做到这一点,而不是在循环的每次迭代中创建新的数据帧;也许有一些已经存在的函数可以从一个可能授予我一个列表的因子中提取每个唯一对,并且可以选择通过一个循环实现相同的结果?

1 个答案:

答案 0 :(得分:2)

这是使用base-R函数'combn'在没有for循环的情况下执行此操作的方法。它使用原始数据的子集,而无需创建新的数据帧。对绘图的调用还管理了轴标记和图标题。

#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