1

最近、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))]
4

1 に答える 1