如何按每个因子水平求和?

时间:2019-04-09 13:38:56

标签: 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

3 个答案:

答案 0 :(得分:2)

使用rgba(255,255,255,0.001) transparent -webkit-linear-gradient 中的xtabs

base R

数据

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

答案 1 :(得分:1)

如果我正确理解了您的问题,则可以使用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

答案 2 :(得分:1)

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