【问题标题】:Preserving comma class when using dplyr package使用 dplyr 包时保留逗号类
【发布时间】:2017-08-02 08:01:49
【问题描述】:

我有一个数据框,其中包含几个带有“逗号”类的数字列 这是将数据框保存到 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 重置类?

谢谢 拉斐尔

【问题讨论】:

  • 所以做总结,然后转换类。我通过 dplyr 提供了一个函数 here 来执行此操作。所以如果你做df_central_database %&gt;% group_by(Category) %&gt;% summarise_all(.funs = sum) %&gt;% mutate_at(vars(contains('Summ')), funs(f1)),那么类将是comma

标签: r dplyr


【解决方案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 中具有相同名称的“逗号”类的任何列设置为“逗号”类。

【讨论】:

    猜你喜欢
    • 2023-01-14
    • 1970-01-01
    • 2020-07-10
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多