Могу ли я использовать имена из списка / фрейма данных, чтобы их можно было распознать как имя списка / фрейма данных в скрипте R для функции al oop? - PullRequest
0 голосов
/ 07 февраля 2020

Я бы хотел использовать функцию al oop для распознавания имен из списка / фрейма данных как фактического имени списка / фрейма данных в сценарии R (для анализа данных или манипулирования ими). Я создам некоторые псевдоданные, чтобы попытаться показать, что я пытаюсь сделать.

Вот код для создания 3 списков

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

Этот код создает список, содержащий эти имена списков.

vars <- c("height","weight","income")

Приведенный ниже код не запускается, но я бы хотел использовать такой код oop, например, где он берет имя из позиции списка и использует его в сценарии в качестве имени списка. Таким образом, он использует имя для вычисления среднего и использует имя для создания нового объекта.

for (i in 1:3) 
 {mean_**vars[i]** = mean(**vars[i]**) }

Результатом должно быть 3 объекта "mean_height", "mean_weight", "mean_income", которые содержат средние баллы

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

Извинения, если вышеизложенное не было сформулировано слишком хорошо, я довольно плохо знаком с R, поэтому я надеюсь, что в этом есть какой-то смысл.

Любая помощь будет наиболее полезной, или, если вы можете указать мне правильное направление, это было бы здорово.

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Более распространенный подход в R - использовать списки данных, а не отдельные переменные.

Примерно так:

# make this reproducible
set.seed(123)

# make an empty list for the data
raw_data <- list()

# then fill the list. The data can be of varying length in a list.
raw_data$height <- sample(120:200,200,TRUE)
raw_data$weight <- sample(40:140,200,TRUE)
raw_data$income <- sample(20000:200000,200, TRUE)

Тогда цикл становится однострочным, и ваши имена сохраняется с использованием семейства функций *apply:

mean_data <- lapply(raw_data, mean)

# print that
mean_data
$height
[1] 159.06

$weight
[1] 90.83

$income
[1] 114000.7

Обратите внимание, что не нужно было делать:

  • знать количество переменных.
  • имеют переменные одинаковой длины.
  • build al oop и отслеживают имена.

Все обрабатываются автоматически. Ницца.

1 голос
/ 07 февраля 2020

Я предполагаю, что вам нужно что-то вроде ниже, которое создает три объекта в вашей глобальной среде для средств weight, height и income из списка list, то есть

list2env(setNames(Map(mean,lst),paste0("mean_",names(lst))),envir = .GlobalEnv)

ДАННЫЕ

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

lst <- list(height,weight,income)
1 голос
/ 07 февраля 2020

Это может быть то, что вы ищете, где lapply применяет функцию mean к каждому элементу в vars (список фреймов данных). Обратите внимание, что вы хотите составить список фреймов данных, используя имена переменных.

height <- sample(120:200,200,TRUE)
weight <- sample(40:140,200,TRUE)
income <- sample(20000:200000,200, TRUE)

vars <- list(height, weight, income)

lapply(vars, function(x) mean(x))

Затем создайте выходной фрейм данных, используя это:

df1 <- data.frame(lapply(vars, function(x) mean(x)))

colnames(df1) <- c("mean_height", "mean_weight", "mean_income")

df1

Из вашего дополнительного комментария, используя vars <- list(height, weight, income) должен позволить вам сделать это:

mean(height)
mean(vars[[1]])

[1] 160.48
[1] 160.48


Это должно работать для вывода динамически именованных переменных:

vars <- list(height = height, weight = weight, income = income)

for (i in names(vars)){
  assign(paste("mean_", i, sep = ""), mean(vars[[i]]))
}

mean_height
mean_weight
mean_income

[1] 163.28
[1] 90.465
[1] 109686.5

Однако я бы предложил не программировать таким образом, так как это может вызвать проблемы, и это не очень масштабируемо. Например, вы можете получить 10000 переменных.

...