我有一个数据框,其中包含几个带有“逗号”类的数字列 为了将数据框保存到excel文件并显示,需要这样做 使用Openxlsx包的excel逗号格式的数字列。
现在,当我使用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重置类?
由于 圣拉斐尔
答案 0 :(得分:3)
这里的问题是逗号类的Set Rng = ws1.Range(ws1.Range("B1"), ws1.Range("B1").End(xlToRight))
ActiveSheet.ChartObjects("Chart 7").Chart.SetSourceData Source:=Rng
返回整数类。您可以通过编写逗号类对象总和的方法来解决此问题。
制作测试向量:
sum
总和不属于该类:
> z = 1:10
> class(z)="comma"
所以写一个方法:
> sum(z)
[1] 55
现在是:
> sum.comma = function(...,na.rm=FALSE){val = NextMethod();class(val)="comma";val}
现在用你的dplyr示例:
> sum(z)
[1] 55
attr(,"class")
[1] "comma"
它保持了课程。是的,您必须为您可能想要应用于您的课程的任何功能编写方法。 S3类作为属性实现,R有习惯尽早放弃它们。
编写> 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
>
可能更容易:
fixup
返回result = fixup(result, source, "comma")
,但在result
中设置为“逗号”类的任何“comma”类列都具有相同的名称。