Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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
如何在dplyr中选择_if,其中逻辑条件为否定_R_Function_Select_Dplyr - Fatal编程技术网

如何在dplyr中选择_if,其中逻辑条件为否定

如何在dplyr中选择_if,其中逻辑条件为否定,r,function,select,dplyr,R,Function,Select,Dplyr,我想从数据框中选择所有数值列,然后选择所有非数值列。一个显而易见的方法是:- mtcars %>% select_if(is.numeric) %>% head() 这正是我所期望的 mtcars %>% select_if(!is.numeric) %>% head() 这不会发生错误,并在中生成错误消息error!is.numeric:参数类型无效 看看做同样事情的另一种方法:- mtcars %>% select_i

我想从数据框中选择所有数值列,然后选择所有非数值列。一个显而易见的方法是:-

mtcars %>%
    select_if(is.numeric) %>%
    head()
这正是我所期望的

mtcars %>%
    select_if(!is.numeric) %>%
    head()
这不会发生错误,并在中生成错误消息error!is.numeric:参数类型无效

看看做同样事情的另一种方法:-

mtcars %>%
    select_if(sapply(., is.numeric)) %>%
    head()
很好,但是

mtcars %>%
    select_if(sapply(., !is.numeric)) %>%
    head()
失败,并显示相同的错误消息。(purrr::keep的行为方式完全相同)

在这两种情况下,使用-删除不需要的列也会失败,与上述is.numeric版本的错误相同,sapply版本的错误消息错误:无法将整数向量转换为函数

mtcars %>%
    select_if(not(is.numeric(.))) %>%
    head()
的“帮助”页面显示为

is.numeric是一个内部通用基元函数:您可以编写方法来处理特定的对象类,请参见InternalMethods。。。is.numeric的方法只有在类的基类型是double或integer并且值可以合理地视为数字时才应返回true(例如,对它们进行算术是有意义的,并且应通过基类型进行比较)

的帮助页面!说

价值观

为了!,与x长度相同的逻辑或原始向量(对于原始x):如果未执行强制,则从x复制名称、DIM和DIMNAME,以及所有其他属性(包括类)

看看这个有用的问题,我可以看到为什么这不起作用的一些原因,但这里提出的两个解决方案都不起作用

mtcars %>%
    select_if(not(is.numeric())) %>%
    head()
给出is.numeric()中的合理错误错误:0个参数传递给需要1的“is.numeric”

mtcars %>%
    select_if(not(is.numeric(.))) %>%
    head()
由于以下错误而失败:- 如果变量(.tbl,.predicate,caller\u env(),.include\u group\u vars=TRUE),则tbl\u中出现错误:长度(.p)=length(tibble\u vars)不为TRUE

mtcars %>%
    select_if(not(is.numeric(.))) %>%
    head()
这种行为显然违反了“最不出人意料”的原则。现在这对我来说并没有太大的影响,但它表明我没有理解一些更基本的观点

有什么想法吗?

您可以定义自己的“非数字”函数,然后改用它

is_not_num <- function(x) !is.numeric(x)

mtcars %>%
select_if(is_not_num) %>%
head()
不是\u num%
如果(不是数量)%>%,请选择
总目()
是否可以使用专用的
否定()
purr::Negate()
函数(而不是否定向量的
运算符)对谓词函数执行相同的否定操作:

或者(
purr::negate()
(小写)的行为稍有不同,请参见相应的帮助页面):

library(purrr)
library(dplyr)

mtcars %>% 
  mutate(foo = "bar") %>% 
  select_if(negate(is.numeric)) %>% 
  head()

#   foo
# 1 bar
# 2 bar
# 3 bar
# 4 bar
# 5 bar
# 6 bar