В R как случайно выбрать (и усреднить) группы из 3 и (и оставшиеся 2) переменные среди 5? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть 400 строк с несколькими столбцами, последние пять из которых: a, b, c, d, e

. Для каждой строки я хочу случайным образом выбрать три из вышеперечисленных 5 переменных и выполните rowmeans (varx, var, varz) для создания столбца trio_average, а две другие создайте pair_average.

Например, одна строка может быть средним значением b, d, e для столбца "trio_average" и среднее значение a, c для «pair_average», а следующим может быть среднее значение a, c, e и b, d.

Я сделал это довольно окольным путем ... Я использовал "randomizr ()", чтобы сгенерировать переменную с именем "trio_set" с 400 случайными (условно случайными, чтобы все они были равными) tr ios из 5 переменных. Есть 10 возможных комбинаций из 5 переменных, поэтому у меня есть 40, каждая из которых, например, "a_c_e", "b_c_d" et c.

Затем я использовал последовательность из 10 операторов if_else:

data <- transform(data, trio_average = ifelse(trio_set = "a_b_c", rowMeans(data[c("a","b","c")]),
    ifelse(trio_set = "a_b_d", rowMeans(data[c("a","b","d")]), ....

Затем я бы сделал это еще 10 раз для пар.

Это действительно делает работу, но в действительности мои имена столбцов намного длиннее, например, "a", поэтому мой код в конце довольно плохо выглядит и неэффективно. Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 04 февраля 2020

Используя базу R, мы можем использовать построчно apply

cols <- c('a', 'b', 'c', 'd', 'e')
df$trio_average <- apply(df[cols], 1, function(x) mean(sample(x, 3), na.rm = TRUE))

Выберите нужные столбцы c, которые вас интересуют, и для каждой строки случайным образом выберите 3 значения и возьмите их mean ,


Чтобы получить mean чисел, которые не были выбраны, мы можем сохранить индекс случайных чисел и использовать его, чтобы получить две пары средних для каждой строки.

df[c('chosen', 'remaining')] <- t(apply(df[cols], 1, function(x) {
      inds <- sample(seq_along(x), 3)
      c(mean(x[inds]), mean(x[-inds]))
}))
...