R-遍历列差分

时间:2018-11-22 21:42:51

标签: r

假设我们有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)等的循环?非常感谢。

2 个答案:

答案 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)