Хобрук: Ваш путь к мастерству в программировании

Сохранение класса запятой при использовании пакета dplyr

У меня есть фрейм данных с несколькими числовыми столбцами с классом «запятая», который необходим для сохранения фрейма данных в файле excel и отображения числовых столбцов в формате запятой excel с использованием пакета Openxlsx.

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

Можно ли каким-то образом использовать пакет dplyr и при этом сохранить исходные классы запятых?

Вот фрейм данных с классами запятых:

library(tidyverse)
library(stringr)

set.seed(10)
df_central_database <- data.frame(Category = as.character(sample(words[1:10], size = 50, replace = TRUE)) ,
           Summ_Income =sample(1000:10000, size = 50, replace = TRUE),
           Summ_Securities =sample(1000:10000, size = 50, replace = TRUE),
           Summ_Bonds =sample(1000:10000, size = 50, replace = TRUE),
           Summ_Options =sample(1000:10000, size = 50, replace = TRUE)
           )


class(df_central_database$Summ_Income) <- "comma"
class(df_central_database$Summ_Securities) <- "comma"
class(df_central_database$Summ_Bonds) <- "comma"
class(df_central_database$Summ_Options) <- "comma"


str(df_central_database)

'data.frame':   50 obs. of  5 variables:
 $ Category       : Factor w/ 10 levels "a","able","about",..: 6 4 5 7 1 3 3 3 7 5 ...
 $ Summ_Income    :Class 'comma'  int [1:50] 4189 9428 3213 5258 2724 6249 5135 5207 4598 5548 ...
 $ Summ_Securities:Class 'comma'  int [1:50] 4099 1551 4321 4668 9229 8999 9854 5295 7242 4832 ...
 $ Summ_Bonds     :Class 'comma'  int [1:50] 8916 2774 1625 2416 4001 2620 2318 3615 9425 1922 ...
 $ Summ_Options   :Class 'comma'  int [1:50] 3008 5823 6963 8633 2342 7031 7855 9988 3369 8967 ...

Теперь использование пакета dplyr для группировки и суммирования сбрасывает новые столбцы фрейма данных обратно в int :

df_rep1 <- df_central_database %>%
  group_by(Category) %>%
  summarise_all(.funs = sum)

str(df_rep1)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   10 obs. of  5 variables:
 $ Category       : Factor w/ 10 levels "a","able","about",..: 1 2 3 4 5 6 7 8 9 10
 $ Summ_Income    : int  23632 24434 48506 28288 26662 22076 19452 22832 25071 3469
 $ Summ_Securities: int  20390 20588 48728 31054 31550 33387 25930 28458 35604 8760
 $ Summ_Bonds     : int  21531 23576 33218 29206 26030 25966 34724 30306 36029 7113
 $ Summ_Options   : int  24345 31356 54054 28524 44705 28161 35068 25267 28022 5713

Можно ли как-то запретить dplyr сбрасывать класс?

Спасибо Рафаэль

02.08.2017

  • Итак, подведите итоги, а затем преобразуйте класс. Я предоставил функцию здесь для этого через dplyr. Итак, если вы сделаете df_central_database %>% group_by(Category) %>% summarise_all(.funs = sum) %>% mutate_at(vars(contains('Summ')), funs(f1)), то класс будет comma 02.08.2017

Ответы:


1

Проблема здесь в том, что sum класса-запятой возвращает целочисленный класс. Вы можете исправить это, написав метод для суммы объектов класса запятых.

Сделайте тестовый вектор:

> z = 1:10
> class(z)="comma"

Сумма не того класса:

> sum(z)
[1] 55

Итак, напишите метод:

> sum.comma = function(...,na.rm=FALSE){val = NextMethod();class(val)="comma";val}

А теперь это:

> sum(z)
[1] 55
attr(,"class")
[1] "comma"

Итак, теперь с вашим примером dplyr:

> df_rep1 <- df_central_database %>%
+   group_by(Category) %>%
+   summarise_all(.funs = sum)
> 
> str(df_rep1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   10 obs. of  5 variables:
 $ Category       : Factor w/ 10 levels "a","able","about",..: 1 2 3 4 5 6 7 8 9 10
 $ Summ_Income    :Class 'comma'  int [1:10] 23632 24434 48506 28288 26662 22076 19452 22832 25071 3469
 $ Summ_Securities:Class 'comma'  int [1:10] 20390 20588 48728 31054 31550 33387 25930 28458 35604 8760
 $ Summ_Bonds     :Class 'comma'  int [1:10] 21531 23576 33218 29206 26030 25966 34724 30306 36029 7113
 $ Summ_Options   :Class 'comma'  int [1:10] 24345 31356 54054 28524 44705 28161 35068 25267 28022 5713
> 

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

Возможно, было бы проще написать fixup:

result = fixup(result, source, "comma")

который возвращает result, но с любыми столбцами класса «запятая» с теми же именами в source, установленными в класс «запятая».

02.08.2017
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..