首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从心理学中替换均值::描述dataframe的模式

从心理学中替换均值::描述dataframe的模式
EN

Stack Overflow用户
提问于 2020-09-01 23:05:27
回答 1查看 191关注 0票数 0

我喜欢心理学的总结统计::描述,但我想用模式代替平均值,但只对因素变量。如何编程模式的输出,以取代setosa (或任何其他因素变量),我使用虹膜复制,即使它只有一个。

代码语言:javascript
复制
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_else和哪里结合起来,告诉R当FALSE时做什么?如果当变量不是一个因素时,我可以得到输出的平均值,那么我将得到一个合并了方法和模式的列。

Psych生成一个无法选择标识变量名的数据,因此这使得任何手动编码或在mutate()中列出变量都不可能。它们也是我的数据集中的大多数变量(因此,手动或变异(Case_when)即使可以执行,也会非常繁琐)。

PS。我尝试将我的apply()更改为map函数,但是输出与cbind()不兼容,因为它将列出每个因素的其他级别。如果您对代码的这一部分有更好的了解,或者认为这是我可以将getModemean()组合在一起的地方,我不介意提出建议。

EN

回答 1

Stack Overflow用户

发布于 2020-09-01 23:38:06

如果您愿意使用不同的函数来生成相同类型的输出,则可以使用dplyrtidyr来完成这一任务。使用这种方法,您可以使用ifelse()来识别数值变量或非数值变量。唯一要注意的是,如果要让函数为因子生成非数字值,则数值变量的输出也必须是字符。这就是为什么我将mean()函数封装在sprintf()中的原因。

代码语言:javascript
复制
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级别替换了最大值。这并不一定是您想要做的,但是很容易根据变量的类型更改输出的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63696571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档