为每对样本在循环中创建一个向量

时间:2017-09-28 17:15:05

标签: r

我在我的样本之间进行成对计算,我希望每个成对计算都存储在一个单独的向量中。对于3次比较,我有:

sample_12 <- vector(mode="numeric", length = 10)
sample_13 <- vector(mode="numeric", length = 10)
sample_23 <- vector(mode="numeric", length = 10)

是否有可能在循环中创建具有相应名称的这些向量,以便它可以适用于任何给定数量的样本?

我尝试了以下代码,但我无法访问for循环之外的向量,我该如何解决这个问题呢?

pop = 3
sample = vector(mode="numeric", length = 10)
for (i in 1:(pop - 1)) {
  for (j in (i + 1):pop) {
    name <- paste("sample",i,j, sep = "")
    name <- vector(mode="numeric", length = 10)
  }
}

3 个答案:

答案 0 :(得分:1)

您可以使用&#34;分配&#34;功能:

pop = 3
sample = vector(mode="numeric", length = 10)
pop_combos <- combn(pop, 2)
for (i in 1:ncol(pop_combos)) {
    name <- paste("sample_",
                  pop_combos[,i][1],
                  pop_combos[,i][2],
                  sep="")
    assign(name, sample)
}

在循环之外,您现在可以访问向量:

> sample_12
[1] 0 0 0 0 0 0 0 0 0 0

答案 1 :(得分:1)

使用清单:

pop = 3
combinations = apply(combn(pop, m = 2), 2, paste, collapse = "_")

sample = replicate(n = length(combinations), numeric(10), simplify = FALSE)
names(sample) = combinations

sample
# $`1_2`
#  [1] 0 0 0 0 0 0 0 0 0 0
# 
# $`1_3`
#  [1] 0 0 0 0 0 0 0 0 0 0
# 
# $`2_3`
#  [1] 0 0 0 0 0 0 0 0 0 0

然后,您可以访问列表中的每个元素,例如sample[["1_3"]]。这非常容易扩展,并且不需要将名称粘贴在一起并使用assignget,这只是要求难以发现的错误。您可以使用lapply或for循环来轻松迭代列表中的每个项目。根据您的使用情况,使用simplify = TRUE内的默认replicate并将其保留为矩阵或数据框可能更有意义。使用列表的唯一原因是,如果某些向量需要不同的长度。

答案 2 :(得分:0)

你正在寻找这样的东西吗?

请假设您将所有向量保存为data.frame中的行/列

list.values <- list()
col <- ncol(df)
row <- nrow(df)
for( i in 1:(col*row)) {list[[i]] = df - df[i/row,i%%col]} 

现在您可以访问列表[[ i * j ]] 中的所有数据框,这是所有数据框之间的差异元素和元素[ i j ]

E.g:您想要访问在所有数据框和所有数据框之间建立的值  element [2, 3]。然后,执行此操作View(list[[2*3]])