我在我的样本之间进行成对计算,我希望每个成对计算都存储在一个单独的向量中。对于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)
}
}
答案 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"]]
。这非常容易扩展,并且不需要将名称粘贴在一起并使用assign
和get
,这只是要求难以发现的错误。您可以使用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]])