如何在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