結合しようとしているdfに因子列が存在する場合dplyr::bind_rows
のUnequal factor levels: coercing to character
警告を回避するsuped-upバージョンを作成したいと思います(非因子列もある可能性があります)。次に例を示します。
df1 <- dplyr::data_frame(age = 1:3, gender = factor(c("male", "female", "female")), district = factor(c("north", "south", "west")))
df2 <- dplyr::data_frame(age = 4:6, gender = factor(c("male", "neutral", "neutral")), district = factor(c("central", "north", "east")))
その後、bind_rows_with_factor_columns(df1, df2)
(警告なしで)戻ります:
dplyr::data_frame(
age = 1:6,
gender = factor(c("male", "female", "female", "male", "neutral", "neutral")),
district = factor(c("north", "south", "west", "central", "north", "east"))
)
これが私がこれまでに持っているものです:
bind_rows_with_factor_columns <- function(...) {
factor_columns <- purrr::map(..., function(df) {
colnames(dplyr::select_if(df, is.factor))
})
if (length(unique(factor_columns)) > 1) {
stop("All factor columns in dfs must have the same column names")
}
df_list <- purrr::map(..., function (df) {
purrr::map_if(df, is.factor, as.character) %>% dplyr::as_data_frame()
})
dplyr::bind_rows(df_list) %>%
purrr::map_at(factor_columns[[1]], as.factor) %>%
dplyr::as_data_frame()
}
forcats
キャラクターに要素を強制する必要を潜在的に回避するためにパッケージを組み込む方法について誰かがアイデアを持っているかどうか、または同じ機能を維持しながらこれのパフォーマンスを向上させるための一般的な提案があるかどうか疑問に思っています(私はしたいtidyverse
構文に固執する)。ありがとう!
友人からの素晴らしい解決策に基づいて私自身の質問に答えるつもりです:
bind_rows_with_factor_columns <- function(...) {
purrr::pmap_df(list(...), function(...) {
cols_to_bind <- list(...)
if (all(purrr::map_lgl(cols_to_bind, is.factor))) {
forcats::fct_c(cols_to_bind)
} else {
unlist(cols_to_bind)
}
})
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加