2017-08-02 11 views
1

データフレームをExcelのファイルに保存し、 数値の列をExcelのコンマ形式で表示するために必要な、コンマクラス の数値列のデータフレームがありますOpenxlsxパッケージを使用します。dplyrパッケージを使用する場合、コンマクラスを保持する

は、今私はグループ化するために、パッケージを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がクラスをリセットしないようにしますか?ここ

おかげ ラファエル

+1

したがって、クラスを要約して変換します。私はdplyr経由でこれを行うための関数[here](https://stackoverflow.com/a/45415788/5635580)を提供しました。ですから、 'df_central_database%>% GROUP_BY(カテゴリ)%>% summarise_all(.funs =合計)%>%mutate_at(VARS(( 'SUMM')が含まれ)、低速運行(F1))'、そのクラスを行う場合'コンマ'になります – Sotos

答えて

2

問題はカンマクラスの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セットで同じ名前のクラス「コンマ」のいずれかの列を持ちます。

関連する問題