我最近发现了 purrr,我真的很喜欢 map 功能。有谁知道如何解决以下问题:
我有一个数据框,我根据某个变量将其拆分为多个数据框 - 一旦拆分,我想删除结果列表中数据框中唯一的列。在单个数据框中解决这个问题非常容易,但在一个列表中我不太确定 - 你将如何通过使用地图来解决这个问题?
我目前的解决方案如下:
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
应用于变量。任何人都可以使用 purrr 包中的地图来帮助执行此操作。remover
target
解决了
@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))]