r summarize_if 有多个条件
r summarize_if with multiple conditions
我正在尝试将观察的 df 减少为单个观察(单行)。
我想 summarize_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)
一种可能是:
df_finale %>%
summarise_all(~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.))
num str
1 4 toy
或自 dplyr 1.0.0
以来的选项:
df_finale %>%
summarise(across(everything(), ~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.)))
我们可以使用 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
或从 dplyr
的新版本 across/summarise
i1 <- df_finale %>%
summarise_all(is.numeric) %>%
flatten_lgl
df_finale %>%
summarise(across(names(.)[i1], ~ mean(., na.rm = TRUE)),
across(names(.)[!i1], Mode))
我正在尝试将观察的 df 减少为单个观察(单行)。 我想 summarize_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)
一种可能是:
df_finale %>%
summarise_all(~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.))
num str
1 4 toy
或自 dplyr 1.0.0
以来的选项:
df_finale %>%
summarise(across(everything(), ~ if(is.numeric(.)) mean(., na.rm = TRUE) else Mode(.)))
我们可以使用 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
或从 dplyr
across/summarise
i1 <- df_finale %>%
summarise_all(is.numeric) %>%
flatten_lgl
df_finale %>%
summarise(across(names(.)[i1], ~ mean(., na.rm = TRUE)),
across(names(.)[!i1], Mode))