#python #r #oop #dynamic #repeat
#python #r #ооп #динамический #повторите
Вопрос:
Как я могу построить динамический «конвейер нисходящего потока», чтобы пропускать фреймы данных с помощью R для автоматического вычисления формул с использованием этих фреймов данных? У меня есть этот фрейм данных, называемый autocalc, в котором для уравнений вырезаны пробелы. Например, мне нужно применить такие уравнения, как это: autocalc$PPH <- Tokyo$P / Tokyo$PH
. PPH уже является столбцом / вектором.
autocalc <- data.frame("INCOME" = c("$0 to $15,000","$15,000 to $29,999","$30,000 to $39,999","$40,000 to $49,999","$50,000 to $69,999","$70,000 to $99,999","$100,000 to $149,999"),
"PPH" = c(0,0,0,0,0,0,0),
"PTS" = c(0,0,0,0,0,0,0))
autocalc$PPH <- Tokyo$P / Tokyo$PH
autocalc$PTS <- autocalc$PPH * .05
Результаты этого фрейма данных будут использоваться для построения диаграммы с помощью ggplot2.
Как вы можете видеть из примера уравнения, существует фрейм данных с именем Tokyo . У меня есть три городских фрейма данных (Нью-Йорк, Париж, Токио). Каждый фрейм данных содержит заключенных города (вектор P) и население (вектор PH). Данные далее классифицируются по группам доходов.
Tokyo <- data.frame("INCOME" = c("$0 to $15,000","$15,000 to $29,999","$30,000 to $39,999","$40,000 to $49,999","$50,000 to $69,999","$70,000 to $99,999","$100,000 to $149,999"),
"P" = c(1844,1062,1036,448,770,364,395),
"PH" = c(84900,721007,80800,380004,675000,32900,39500))
Я хочу применить каждый город к фрейму данных autocalc и создать три отдельные диаграммы. Я мог бы скопировать / вставить три версии autocalc для каждого города, но это похоже на плохой код, потому что, если мне нужно что-то исправить в autocalc, мне придется переделывать код для каждого города.
Я просмотрел следующие выводы, но я чувствую, что это не должно быть такой сложной проблемой:
-
Используйте объектно-ориентированное программирование с библиотекой R6. Создайте класс autocalc и примените копию к трем городам? Существует не так много руководств по R6, которые имеют смысл для новичка, поэтому я чувствую, что есть более простой способ?
-
Используйте lapply() . Я нашел учебник, который создает нечто подобное (три отдельные диаграммы на основе трех отдельных фреймов данных), но он не может объяснить, как поменять
autocalc$PPH <- Tokyo$P / Tokyo$PH
autocalc$PPH <- Paris$P / Paris$PH
местами. И чтобы сохранить вычисления autocalc для каждого города, подготовить три диаграммы. Должен ли я вместо этого избавиться от фрейма данных autocalc и добавить строки в фрейм данных каждого города? -
Мой друг не очень хорошо разбирается в R, но является программистом и рекомендует изучить методы сбора. Написать сценарий и использовать методы для выполнения повторяющихся операций. Однако я не могу найти учебное пособие по R. Я думаю, это требует от меня использования объектно-ориентированного программирования с библиотекой R6? Я думаю, может быть, моя задача лучше подходит для Python? Мне говорят, что R больше для анализа, а не для создания чего-то столь динамичного, как это.
Ответ №1:
Я думаю, что вариант 2 является наиболее простым и простым. Вы можете поместить 3 фрейма данных в список и использовать lapply
. Вы можете передать анонимную функцию lapply
для ссылки на фрейм данных каждого города внутри функции.
list_dfs <- list(Tokyo, Paris, NewYork)
list_plots <- lapply(list_dfs, function(x) {
autocalc$PPH <- x$P / x$PH
autocalc$PTS <- autocalc$PPH * .05
#ggplot2 code here
})
После ввода ggplot2
кода lapply
он сгенерирует список из 3 графиков для каждого города, к которому вы можете получить доступ, выполнив list_plots[[1]]
, list_plots[[2]]
и list_plots[[3]]
.
Комментарии:
1. Спасибо, это определенно шаг в правильном направлении. Но я получаю эту ошибку при запуске кода:
Error: $ operator is invalid for atomic vectors
. Я попытался поменять местами x $ P и x $ PH сx[["P"]]
помощью andx[,"P"]
. Однако я получаю новые ошибки о том, что индекс находится за пределами границ.2. @AvocadoBoat Вы уверены, что ваши столбцы названы как
P
иPH
в dataframeTokyo
Paris
и т.д. Вы запустили первую строкуlist_dfs <- list(Tokyo, Paris, NewYork)
?3. Да, они названы правильно, и я запустил первую строку. Однако, когда я тестирую распечатанный list_dfs, отображаются только слова Токио, Париж, Нью-Йорк. Весь фрейм данных для каждого города не печатался. Поэтому я не думаю, что фреймы данных были помещены в список. Просто название фреймов данных. Это может объяснить ошибку атомарного вектора и ошибку индекса вне границ. Но я не знаю, как это исправить.
4. Итак, у вас есть только имена в этих городах. Что это за 3 фрейма данных для каждого города? Вы добавляете кавычки к таким именам?
list_dfs <- list('Tokyo', 'Paris', 'NewYork')
. Там нам не нужны кавычки, см. Мой ответlist_dfs <- list(Tokyo, Paris, NewYork)
, он без кавычек.5. Это было моей ошибкой. Удаление кавычек решило проблему! Спасибо. К сожалению, теперь три графика идентичны. Я извлек код ggplot2 и попытался создать
list_plots
в виде таблиц, выполнивlist_plots[[1]] list_plots[[2]] list_plots[[3]]
после кода lapply, и все они одинаковы для первого города в list_dfs.