R - перебирая дифференциалы столбцов - PullRequest
0 голосов
/ 23 ноября 2018

давайте предположим, что у нас есть 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-оценки для этих различий.Так что-то вроде масштаба (да).Как создать цикл, который в основном будет масштабироваться (ba), затем масштабироваться (ca), scale (da) и т. Д.?большое спасибо.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Одиночные именованные переменные не слишком хорошо подходят для "зацикливания".Давайте вместо этого используем 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 матриц (вектор столбцов).Имена столбцов показывают, какие векторы были вычтены до масштабирования.

0 голосов
/ 23 ноября 2018

Мы можем поместить его в 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] и сохранить его как matrix из 1 столбца

out <- combn(lst1, 2, FUN = function(x) scale(Reduce(`-`, x)), simplify = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...