假设我们有4个向量
a <- c(200,204,209,215)
b <- c(215,220,235,245)
c <- c(230,236,242,250)
d <- c(240,242,243,267)
我基本上想创建一个循环,该循环创建每对之间的差异,然后计算这些差异的Z得分。像scale(d-a)这样的东西。如何创建基本上按比例(b-a),然后按比例(c-a),按比例(d-a)等的循环?非常感谢。
答案 0 :(得分:1)
单个命名变量不太适合“循环”。
让我们改用list()
的向量:
vecs <- list(
a = c(200,204,209,215),
b = c(215,220,235,245),
c = c(230,236,242,250),
d = c(240,242,243,267)
)
这允许我们使用combn
scale_diff <- function(subset) {
z <- scale(subset[[1]] - subset[[2]])
colnames(z) <- paste(names(subset), collapse = " - ")
z
}
z_scores <- combn(vecs, 2, scale_diff, simplify = FALSE)
现在z_scores
是6个矩阵(列向量)的列表。列名称显示缩放之前减去了哪些向量。
答案 1 :(得分:0)
我们可以将其放在list
中,并使用combn
来获得组合,然后应用差异
lst1 <- list(a = a, b = b, c = c, d = d)
out <- combn(lst1, 2, FUN = function(x) scale(Reduce(`-`, x))[,1])
colnames(out) <- combn(names(lst1), 2, FUN = paste, collapse='_')
out
# a_b a_c a_d b_c b_d c_d
#[1,] 0.9108601 1.2009612 0.1290994 -0.7643506 -0.753390 -0.2219686
#[2,] 0.7759179 0.2401922 0.3872983 -0.9441978 -0.360317 0.3699477
#[3,] -0.5735045 -0.2401922 0.9036961 0.6744270 1.474024 1.1098432
#[4,] -1.1132735 -1.2009612 -1.4200939 1.0341214 -0.360317 -1.2578222
如评论中@AlexR所述,如果属性很重要,请删除[,1]
并将其保留为1列的matrix
out <- combn(lst1, 2, FUN = function(x) scale(Reduce(`-`, x)), simplify = FALSE)