«Индексирование» (в математическом смысле) переменных в R, так что правильная переменная выбирается на каждой итерации цикла - PullRequest
0 голосов
/ 28 января 2020

У меня 28 переменных. Каждый из них является вектором числительного c класса. Имена этих векторов: sub_1, sub_2, sub_3 и так далее и далее вплоть до sub_28.

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

Правая часть каждого уравнения - это вычисление, которое я хочу выполнить для каждого вектора, а левая часть - то, где я хочу хранить результаты каждого расчета.

Так вот, что я делаю. Сначала я объявляю вектор длины 28.

alpha = vector ("Numberri c", 28)

Каждый компонент этого вектора собираюсь сохранить соответствующие результаты расчетов.

Например, я хочу установить альфа [ 1 ] равной

1 + длина ( sub_1 ) * (сумма (log ( sub_1 / (1.5))))

И я хочу установить альфа [ 2 ] равно

1 + длина ( sub_2 ) * (сумма (log ( sub_2 / (1.5))))

И так далее. Вы поняли.

Я думал об использовании 'for' l oop. Вот что мне приходит в голову:

для (я в 1:28) {

альфа [я] = 1 + длина ( sub_i ) * (сумма ( log ( sub_i / (1.5))))

}

Я точно знаю, что не так с этим кодом. Компилятор ищет переменную с именем sub_i и не найдет ее, потому что я ее не объявил. Мне нужно, чтобы компилятор считал _i как субиндекс. Я хочу, чтобы компилятор смотрел - на каждой итерации цикла - вектор sub_i, чей субиндекс i соответствует номеру итерации. Как мне этого добиться?

Редактировать: кстати, 28 векторов имеют разную длину.

1 Ответ

0 голосов
/ 28 января 2020

Я бы поместил 28 числовых c переменных векторов в список и применил бы функцию ко всем элементам списка. Моделируемые данные:

set.seed(1) # for reproducibility
# pick some random vector lengths
veclengths <- sample(50:100, 28, replace = TRUE) 
# generate random numeric values to generate the vectors
my.variables <- lapply(veclengths, function(x) rnorm(x,100,10))
# name the vectors as in your example (not required)
names(my.variables) <- paste0("sub_", seq_along(my.variables))
# extract these 28 separate vectors as individual variables for your use case
list2env(my.variables , envir = .GlobalEnv)

Затем вы можете загрузить свои векторы в список, например,

vars <- ls(pattern="sub_.*") # pick variables by name pattern
# I sorted here numerically, for convenience
my.variables <- mget(vars[order(as.numeric(gsub("sub_", "", vars)))])

Затем просто применить выбранную функцию ко всем элементам списка отдельно

resfun <- function(x) {1 + length(x)*(sum(log(x/(1.5))))}
alpha <- unlist(lapply(my.variables, resfun))
...