【问题标题】:How to get sum by each factor level?如何按每个因子水平求和?
【发布时间】:2019-04-09 13:38:56
【问题描述】:

我过滤了数据,其中一列有 5 个因子水平,我想得到每个因子水平的总和。

我正在使用下面的代码

levels(df_Temp$ATYPE)
[1] "a"  "b" "c"  "d"   "Unknown" 

我正在使用下面的代码

cast(df_Temp,ATYPE~AFTER_ADM, sum, value = "CHRGES") 

但我得到的输出如下

  ATYPE 0          1
1 a     0 2368968.39
2 b     0 3206567.47
3 c     0   19551.19
4 e     0 2528688.12

我想对所有因子水平和因子水平的缺失数据求和为“0”。

所以想要的输出是

  ATYPE 0          1
1 a     0 2368968.39
2 b     0 3206567.47
3 c     0   19551.19
4 d     0          0
5 e     0 2528688.12

【问题讨论】:

  • 它不工作
  • 试试xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp)
  • cast(df,ATYPE~AFTER_ADM, sum, value = "CHRGES", add.missing = TRUE) 是使用reshape的命令

标签: r


【解决方案1】:

使用来自base Rxtabs

xtabs(CHRGES ~ ATYPE + AFTER_ADM, subset(df_Temp, ATYPE != "e"))
#   AFTER_ADM
#ATYPE           0           1
#    a  0.00000000 -5.92270971
#    b -1.68910431  0.05222349
#    c -0.26869311  0.16922669
#    d  1.44764443 -1.59011411
#    e  0.00000000  0.00000000

数据

set.seed(24)
df_Temp <- data.frame(ATYPE = sample(letters[1:5], 20, replace = TRUE),
    AFTER_ADM = sample(0:1, 20, replace = TRUE), CHRGES = rnorm(20))

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您可以使用dplyr。首先我创建了一个示例数据集:

    set.seed(123)
    x <- sample(letters[1:5], 1e3, replace = T)
    x[x == "e"] <- "Unknown"
    y <- sample(1:100, 1e3, replace = T)
    df1 <- data.frame(ATYPE = factor(x), AFTER_ADM = y)
    df1$AFTER_ADM[df1$ATYPE == "Unknown"] <- NA
    
    head(df1, 10)
         ATYPE AFTER_ADM
    1        b        28
    2        d        60
    3        c        17
    4  Unknown        NA
    5  Unknown        NA
    6        a        48
    7        c        78
    8  Unknown        NA
    9        c         7
    10       c        45
    

    然后使用group_by 和summary 得到总和和计数。我不确定您是否想要因子水平的计数,但如果您不感兴趣,很容易取出:

    library(dplyr)
    
    df1 %>%
      group_by(ATYPE) %>%
      summarise(sum_AFTER_ADM = sum(AFTER_ADM, na.rm = T),
                n_ATYPE = n())
    # A tibble: 5 x 3
      ATYPE   sum_AFTER_ADM n_ATYPE
      <fct>           <int>   <int>
    1 a               10363     198
    2 b               11226     206
    3 c                9611     203
    4 d                9483     195
    5 Unknown             0     198
    

    【讨论】:

    • 运行良好,但我使用了一行代码xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp) 作为我的最终代码。谢谢
    【解决方案3】:

    使用dplyrtidyr 的另一种可能的解决方案。使用这两个包中的 count 和 complete 将有助于解决您的问题。

        library(dplyr)
        library(tidyr)
        #using iris as toy data
        iris2 <- iris %>% 
                 filter(Species != "setosa")
    
        #count data and then fill n with 0 
        ir3 <- count(iris2, Species) %>% 
            complete(Species, fill = list(n =0))
    

    【讨论】:

    • 运行良好,但我使用了一行代码xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp) 作为我的最终代码。谢谢
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多