最近、purrr を発見しました。マップ機能がとても気に入っています。誰もが次の問題に取り組む方法を知っています:
特定の変数に基づいて複数のデータフレームに分割したデータフレームがあります。一度分割すると、結果のリストで一意のデータフレームの列を削除したいと思います。これを単一のデータフレームで解決するのは非常に簡単ですが、リストではよくわかりません-マップを使用してこれをどのように解決しますか?
私の現在の解決策は次のとおりです。
set.seed(123)
dat <- data.frame(target = round(runif(9, min = 0, max = 1), 0),
split_var = c(rep("x", 3), rep("y", 3), rep("z", 3)),
var1 = c(rep("a", 3), rep("b", 2), "c", rep("d", 2), "e"),
var2 = paste("m", round(rnorm(9, mean = 5), 2), sep = "_"))
mod_dat <- dat %>% split(dat$split_var)
remover <- function(df){
non_unique_cols <- sapply(df, function(x) length(unique(x))) > 1
return(df[, non_unique_cols])
}
map(mod_dat, remover)
追加の問題があります。変数map
に適用remover
したくありません。target
誰でも purrr パッケージのマップを使用してこれを行うのを手伝ってもらえますか?
解決した
@akrun によって提供された最終的な解決策 - 完全なクレジットは彼にあります。
mod_dat <- dat %>%
split(.$split_var) %>%
map( ~ Filter(function(x) n_distinct(x) > 1, .)) %>%
Filter(function(x) sum(names(x) %in% "target"), .)
mod_dat
わずかな違いは、ここではターゲット変数をドロップするデータフレームもドロップすることです。私の目的では、これらのデータフレームを保持する必要はありません。次のコードを使用すると、保持するレベルと削除するレベルをすばやく判断できます。
# In
unique(dat$split_var)[(unique(dat$split_var) %in% names(mod_dat))]
# Out
unique(dat$split_var)[!(unique(dat$split_var) %in% names(mod_dat))]