aggreate函数不使用标准偏差和因子

aggreate函数不使用标准偏差和因子,r,R,我试图得到一个数据框中一列的标准偏差,由其他几列分组 x <- c("Paul", "Paul", "Paul", "Jennifer", "Jennifer", "Jennifer") y <- c("a", "a", "b", "c", "c", "d&

我试图得到一个数据框中一列的标准偏差,由其他几列分组

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)



标准偏差给了我一个错误:

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.
为什么呢?我试图理解错误信息,但我不明白为什么它适用于均值,而不适用于标准差。如果我把所有的因子都转换成字符,那么标准差就起作用了,并给出了正确的结果。为什么呢


将整个数据帧作为
x
参数传递。相反,您应该传递要聚合的变量。有两种方法可以使用
aggregate
函数

  • 使用值-
  • 使用公式语法:
  • 这同样适用于
    sd
    功能


    在您的尝试中,将计算所有值的
    平均值
    /
    sd
    。传递
    因子
    变量时,
    平均值
    标准差
    的输出不同

    mean(df$Fall)
    #[1] NA
    
    但是返回一个警告

    警告信息: 默认值(df$Fall):参数不是数字或逻辑参数:返回NA

    sd
    返回一个错误

    sd(df$Fall)
    
    变量中的错误(如果(is.vector(x)| is.factor(x))x否则为.double(x),na.rm=na.rm): 对因子x调用var(x)已失效。 使用类似“all(复制的(x)[-1L])”的方法测试常量向量


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

    我们可以使用
    dplyr

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

    那是真的!但是为什么R给了我一个sd的错误,而不是这个例子中的均值?我正在试图找出这两者之间的区别。希望我在答案中的更新有助于理解两者之间的区别。这只是随机的还是背后有一个概念?我不知道你在问什么。我觉得这种行为完全合乎逻辑<因子变量上的代码>平均值返回带有警告的NA,而它计算数值变量的实际平均值<另一方面,代码>sd在因子变量上运行时返回错误。警告不会停止函数的执行,而错误会停止执行。你认为这其中的哪一部分是随机的?对我来说,函数mean返回警告,函数sd返回错误是随机的。
    mean(df$Fall)
    #[1] NA
    
    sd(df$Fall)
    
    library(dplyr)
    df %>%
        group_by(Fall, DRG, DRG2) %>%
        summarise(Anzahl = mean(Anzahl, na.rm = TRUE))