首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-多条件summarize_if

R-多条件summarize_if
EN

Stack Overflow用户
提问于 2020-05-06 15:07:40
回答 2查看 1.3K关注 0票数 6

我试图将观察的df简化为单个观察(单行)。我希望summarize_if是数字的平均值,如果是字符串或因子的模式。下面的代码不起作用,但我希望它能给出这个想法。谢谢!

代码语言:javascript
复制
#data frame
num <- c(1:7)
str <- c("toy","control","play",NA,"give","toy","toy")
df_finale <- data.frame(num,str)

#mode function
Mode <- function(x) {
        ux <- unique(x)
        ux[which.max(tabulate(match(x, ux)))]
}

#df reduction
df_finale <- df_finale %>%
                    summarize_if(is.numeric, mean, na.rm = TRUE) %>%
                    summarize_else_if(!is.numeric, Mode)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-06 15:13:16

一种可能是:

代码语言:javascript
复制
df_finale %>%
 summarise_all(~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.))

  num str
1   4 toy

或者是一个选项,因为dplyr 1.0.0

代码语言:javascript
复制
df_finale %>%
 summarise(across(everything(), ~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.)))
票数 5
EN

Stack Overflow用户

发布于 2020-05-06 18:51:50

我们可以用mutate_ifdistinct

代码语言:javascript
复制
library(dplyr)
library(purrr)
df_finale %>%
     mutate_if(is.numeric, mean, na.rm = TRUE) %>% 
     mutate_if(negate(is.numeric), Mode) %>%
     distinct
#   num str
#1   4 toy

或者使用新版本的across/summarisedplyr

代码语言:javascript
复制
i1 <- df_finale %>% 
           summarise_all(is.numeric) %>%
           flatten_lgl

df_finale %>% 
     summarise(across(names(.)[i1], ~ mean(., na.rm = TRUE)), 
               across(names(.)[!i1], Mode))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61638625

复制
相关文章

相似问题

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