Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
{R} 使用purr删除空白列或唯一列_R_Variables_Dictionary_Unique_Purrr - Fatal编程技术网

{R} 使用purr删除空白列或唯一列

{R} 使用purr删除空白列或唯一列,r,variables,dictionary,unique,purrr,R,Variables,Dictionary,Unique,Purrr,我最近发现了purrr,我非常喜欢map函数。是否有人知道如何解决以下问题: 我有一个dataframe,我根据某个变量将其拆分为多个dataframe—拆分后,我希望删除结果列表中dataframes中唯一的列。在单个数据帧中解决这个问题相当容易,但在列表中我不太确定-您如何使用map解决这个问题 我目前的解决方案如下: set.seed(123) dat <- data.frame(target = round(runif(9, min = 0, max = 1), 0),

我最近发现了purrr,我非常喜欢map函数。是否有人知道如何解决以下问题:

我有一个dataframe,我根据某个变量将其拆分为多个dataframe—拆分后,我希望删除结果列表中dataframes中唯一的列。在单个数据帧中解决这个问题相当容易,但在列表中我不太确定-您如何使用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)
稍有不同的是,在这里,我们也会删除数据帧,而这些数据帧会删除目标变量——出于我的目的,没有必要保留这些数据帧。以下代码可用于快速确定保留哪些级别以及删除哪些级别

# 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))]
我们可以试试

library(dplyr)
library(purrr)
dat %>% 
   split(.$split_var) %>%
   map(~Filter(function(x) n_distinct(x) >1 , .))

根据OP的数据集和更新后的问题,我们可以使用
setdiff
仅选择
筛选所需的列,并使用
bind_cols
,加入“目标”

 dat %>% 
     split(.$split_var) %>% 
     map(~bind_cols(.["target"], Filter(function(x) 
        n_distinct(x) >1 , .[setdiff(names(.), "target")])))
#$x
#  target   var2
#1      0 m_4.89
#2      1 m_4.88
#3      0 m_5.18

#$y
#  target var1   var2
#1      1    b m_6.28
#2      1    b m_3.27
#3      0    c m_6.69

#$z
#  target var1   var2
#1      1    d  m_5.5
#2      1    d m_7.53
#3      1    e m_5.55
数据
dat我们可以试试

library(dplyr)
library(purrr)
dat %>% 
   split(.$split_var) %>%
   map(~Filter(function(x) n_distinct(x) >1 , .))

根据OP的数据集和更新后的问题,我们可以使用
setdiff
仅选择
筛选所需的列,并使用
bind_cols
,加入“目标”

 dat %>% 
     split(.$split_var) %>% 
     map(~bind_cols(.["target"], Filter(function(x) 
        n_distinct(x) >1 , .[setdiff(names(.), "target")])))
#$x
#  target   var2
#1      0 m_4.89
#2      1 m_4.88
#3      0 m_5.18

#$y
#  target var1   var2
#1      1    b m_6.28
#2      1    b m_3.27
#3      0    c m_6.69

#$z
#  target var1   var2
#1      1    d  m_5.5
#2      1    d m_7.53
#3      1    e m_5.55
数据
dat@akrun我正在添加它away@akrun我马上就把它加上去了!那好多了!这正是我所拥有的。有一个小问题,我如何指定不将其应用于目标变量?@CharlFrancoisMarais目标变量是什么?我在我的原始帖子中添加了它-请看一看。它应该是1或0完美!你帮了大忙!谢谢!但问题得到了回答——剩下的很简单;)我需要删除目标是唯一的数据帧,因为没有模型可以建立在这些数据帧上…漂亮!那好多了!这正是我所拥有的。有一个小问题,我如何指定不将其应用于目标变量?@CharlFrancoisMarais目标变量是什么?我在我的原始帖子中添加了它-请看一看。它应该是1或0完美!你帮了大忙!谢谢!但问题得到了回答——剩下的很简单;)我需要删除目标唯一的数据帧,因为不能在这些数据帧上构建模型。。。