0

我喜欢 psych::describe 的汇总统计数据,但我想用众数替换平均值,但仅适用于因子变量。如何对 Mode 的输出进行编程以替换 setosa(或任何其他因素变量) 我使用 iris 进行复制,即使它只有一个。

getMode <- function(df) {
  ux <- na.omit(unique(df))
  ux[which.max(tabulate(match(df, ux)))]
}

Mode <- apply(iris%>% select(where(is.factor)), 2, getMode)

#I only want 5 of psych's descriptive stats plus the mode.
table <- cbind(psych::describe(iris),
                      Mode) [,c(3,4,8,9,2, 14)] 
table

如何根据变量的结构来组合均值和模式?

  1. 有没有办法结合if_elsewhere 告诉 R 什么时候做什么FALSE?如果当变量不是一个因素时我能得到输出的平均值,我会得到一个结合了平均值和模式的列。

Psych生成一个数据框,其中标识变量名称不可选择,因此这使得任何手动编码或在 mutate() 中列出变量都是不可能的。它们也是我数据集中的大多数变量(因此即使可以完成手动或 mutate(case_when) 也会非常乏味)。

PS。我尝试更改我apply()的 tomap函数,但输出与 the 不兼容,cbind()因为它会列出每个因素的其他级别。如果您对代码的那部分有更好的想法,或者认为这是我可以结合的地方getModemean()我不介意建议。

4

1 回答 1

1

如果您愿意使用不同的函数来产生相同类型的输出,则可以使用dplyrandtidyr来完成此操作。使用这种方法,您可以做任何您想做的事情ifelse()来识别数字或非数字变量。唯一需要注意的是,如果您让函数为因子生成非数字值,则数字变量的输出也必须是字符。这就是为什么我将mean()函数包装在sprintf().

getMode <- function(df) {
  ux <- na.omit(unique(df))
  ux[which.max(tabulate(match(df, ux)))]
}

library(tidyr)
iris %>% 
  summarise_all(.funs = list(
    mean = function(x)ifelse(is.numeric(x), sprintf("%.3f", mean(x)), as.character(getMode(x))), 
    sd = function(x)ifelse(is.numeric(x), sd(x), sd(as.numeric(x))), 
    min = function(x)ifelse(is.numeric(x), sprintf("%.3f", min(x)), levels(x)[1]), 
    max = function(x)ifelse(is.numeric(x), sprintf("%.3f", max(x)), levels(x)[length(levels(x))]), 
    n = function(x)sum(!is.na(x))
  )) %>% 
  pivot_longer(everything(),
        names_to = c("set", ".value"),
        names_pattern = "(.+)_(.+)")
                            
# A tibble: 5 x 6
#            set  mean     sd   min    max         n
#          <chr> <chr>  <dbl> <chr>  <chr>     <int>
# 1 Sepal.Length 5.843  0.828 4.300  7.900       150
# 2 Sepal.Width  3.057  0.436 2.000  4.400       150
# 3 Petal.Length 3.758  1.77  1.000  6.900       150
# 4 Petal.Width  1.199  0.762 0.100  2.500       150
# 5 Species      setosa 0.819 setosa virginica   150    
#     

这也允许您进行其他更改 - 例如上面,我将最小值替换为 的第一级,Species将最大值替换为Species. 并不是说这一定是您想要做的,但很容易根据变量的类型更改输出的值。

于 2020-09-01T23:38:06.100 回答