R: Как автоматизировать вычисление фрейма данных, а затем создать диаграмму на основе результатов для нескольких фреймов данных?

#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, мне придется переделывать код для каждого города.

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

  1. Используйте объектно-ориентированное программирование с библиотекой R6. Создайте класс autocalc и примените копию к трем городам? Существует не так много руководств по R6, которые имеют смысл для новичка, поэтому я чувствую, что есть более простой способ?

  2. Используйте lapply() . Я нашел учебник, который создает нечто подобное (три отдельные диаграммы на основе трех отдельных фреймов данных), но он не может объяснить, как поменять autocalc$PPH <- Tokyo$P / Tokyo$PH autocalc$PPH <- Paris$P / Paris$PH местами. И чтобы сохранить вычисления autocalc для каждого города, подготовить три диаграммы. Должен ли я вместо этого избавиться от фрейма данных autocalc и добавить строки в фрейм данных каждого города?

  3. Мой друг не очень хорошо разбирается в 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"]] помощью and x[,"P"] . Однако я получаю новые ошибки о том, что индекс находится за пределами границ.

2. @AvocadoBoat Вы уверены, что ваши столбцы названы как P и PH в dataframe Tokyo 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.