聚集函数不适用于标准偏差和因子

时间:2020-10-12 09:42:20

标签: r

我正在尝试获取数据框中某一列的标准偏差,并按其他几列进行分组。

x <- c("Paul", "Paul", "Paul", "Jennifer", "Jennifer", "Jennifer")
y <- c("a", "a", "b", "c", "c", "d")
g <- c("eins", "eins", "zwei", "drei", "drei", "vier")
z <- c(1,2,3,4,5,6)
df <- tibble(Fall = x, DRG = y, DRG2 = g, Anzahl = z)

df$Fall <- as.factor(df$Fall)
df$DRG <- as.factor(df$DRG)
df$DRG2 <- as.factor(df$DRG2)



这是小标题:

df
# A tibble: 6 x 4
  Fall     DRG   DRG2  Anzahl
  <fct>    <fct> <fct>  <dbl>
1 Paul     a     eins       1
2 Paul     a     eins       2
3 Paul     b     zwei       3
4 Jennifer c     drei       4
5 Jennifer c     drei       5
6 Jennifer d     vier       6

计算均值作品:

aggregate(x = df, 
          by = list(df$Fall, df$DRG, df$DRG2),
          FUN = mean, na.rm = TRUE)

   Group.1 Group.2 Group.3 Fall DRG DRG2 Anzahl
1 Jennifer       c    drei   NA  NA   NA    4.5
2     Paul       a    eins   NA  NA   NA    1.5
3 Jennifer       d    vier   NA  NA   NA    6.0
4     Paul       b    zwei   NA  NA   NA    3.0

标准偏差给我一个错误:

aggregate(x = df, 
          by = list(df$Fall, df$DRG, df$DRG2),
          FUN = sd, na.rm = TRUE)

Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) : 
  Calling var(x) on a factor x is defunct.
  Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.

那是为什么?我试图理解错误消息,但我不明白为什么它会以均值而不是标准差运行。如果我将所有因素转换为字符,则标准偏差有效,并给我正确的结果。为什么呢?

致谢

2 个答案:

答案 0 :(得分:1)

您正在将整个数据帧作为x参数传递。相反,您应该将想要的变量传递给aggregate。您可以使用两种方式使用aggregate函数。

  1. 使用值-
aggregate(x = df$Anzahl, 
          by = list(df$Fall, df$DRG, df$DRG2),
          FUN = mean, na.rm = TRUE)
  1. 使用公式语法:
aggregate(Anzahl~ Fall + DRG + DRG2, df, FUN = mean, na.rm = TRUE)

sd函数同样适用。


将尝试计算所有值的mean / sd。传递mean变量时,sdfactor的输出是不同的。

mean(df$Fall)
#[1] NA

但返回警告

警告信息: 在mean.default(df $ Fall)中:参数不是数字或逻辑:返回NA

sd返回错误。

sd(df$Fall)

var(if(is.vector(x)|| is.factor(x))x else as double(x),na.rm = na.rm)中的错误: 调用因子x上的var(x)已失效。 使用“ all(duplicated(x)[-1L])”之类的东西来测试常数向量。

因此,mean似乎有效,而sd返回错误。

答案 1 :(得分:0)

我们可以使用dplyr

library(dplyr)
df %>%
    group_by(Fall, DRG, DRG2) %>%
    summarise(Anzahl = mean(Anzahl, na.rm = TRUE))