如何按每个因子水平获取总和

  • 本文关键字:获取 水平 何按每 r
  • 更新时间 :
  • 英文 :


我已经过滤了数据,其中一列有 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

使用 base R 中的xtabs

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))
如果我

正确理解您的问题,您可以使用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和汇总来获得总和和计数。我不确定您是否想要因子水平的计数,但如果您不感兴趣,很容易取出:

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

另一种使用dplyrtidyr的可能解决方案。使用两个包中的计数和完成将有助于解决您的问题。

    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))

最新更新