r summarize_if с несколькими условиями - PullRequest
6 голосов
/ 06 мая 2020

Я пытаюсь свести df наблюдений к одному наблюдению (одной строке). Я хотел бы summarize_if is numeri c со средним значением, а if - это строка или фактор с режимом. Приведенный ниже код не работает, но я надеюсь, что он дает представление. Спасибо!

#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)

Ответы [ 2 ]

4 голосов
/ 06 мая 2020

Возможный вариант:

df_finale %>%
 summarise_all(~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.))

  num str
1   4 toy
1 голос
/ 06 мая 2020

Мы могли бы использовать mutate_if с distinct

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/summarise из новой версии dplyr

i1 <- df_finale %>% 
           summarise_all(is.numeric) %>%
           flatten_lgl

df_finale %>% 
     summarise(across(names(.)[i1], ~ mean(., na.rm = TRUE)), 
               across(names(.)[!i1], Mode))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...