R dpylr如果有多个条件,则选择

R dpylr如果有多个条件,则选择,r,select,dplyr,R,Select,Dplyr,我想选择所有的数值变量以及一些变量的名称。我已经设法使用select_if来获取数值变量,并选择按名称获取变量,但无法将两者合并为一个语句 x = data.table(c(1,2,3),c(10,11,12),c('a','b','c'),c('x','y','z'), c('l', 'm','n')) 我希望我的结果是: V1 V2 V4 V5 1 10 x l 2 11 y m 3 12 z n 我试过了,但没用 y = x %>% select_if(is.numeric

我想选择所有的数值变量以及一些变量的名称。我已经设法使用select_if来获取数值变量,并选择按名称获取变量,但无法将两者合并为一个语句

x = data.table(c(1,2,3),c(10,11,12),c('a','b','c'),c('x','y','z'), c('l', 'm','n'))
我希望我的结果是:

V1 V2 V4 V5
1 10  x l
2 11  y m
3 12  z n
我试过了,但没用

y = x %>%
select_if(is.numeric, V4, V5)

带有
map
的一个选项(来自
purr


由于数据集是一个
data.table
,对
data.table
进行子集设置的选项为

x[, sapply(x, is.numeric) | colnames(x) != "V3", with = FALSE]
#   V1 V2 V4 V5
#1:  1 10  x  l
#2:  2 11  y  m
#3:  3 12  z  n
数据
x如果我们有一个数据帧,
x

x = data.frame(V1=c(1,2,3),V2=c(10,11,12),V3=c('a','b','c'),V4=c('x','y','z'),V5=c('l', 'm','n'), stringsAsFactors=FALSE)
##  V1 V2 V3 V4 V5
##1  1 10  a  x  l
##2  2 11  b  y  m
##3  3 12  c  z  n
如果
V1
V2
实际上是
numeric
,其余列不是因子,那么我们可以:

library(dplyr)
y <- x %>% select_if(function(col) is.numeric(col) | 
                                   all(col == .$V4) | 
                                   all(col == .$V5))
##  V1 V2 V4 V5
##1  1 10  x  l
##2  2 11  y  m
##3  3 12  z  n

哪个可能更好。

使用data.frame函数:

x = data.frame(V1=c(1,2,3),V2=c(10,11,12),V3=c('a','b','c'),V4=c('x','y','z'),V5=c('l', 'm','n'))

然后
x%>%选择_如果(is.numeric)
有效。

str(x)显示所有列都是字符。我认为这是一个潜在的错误原因?我还想知道您是否可以直接使用列名。
cbind
的目的是什么?只需使用
data.table
。使用
cbind
,所有内容都强制为
字符
矩阵,因此每一列都是
字符
。如果你将
x
定义为
数据表(c(1,2,3),c(10,11,12),c('a','b','c'),c('x','y','z'),c('l','m','n'))
,那么
x%>%如果(是数字的)
工作(在
选择
V4
V5
中的目的是什么?
如果
选择
)@nicola你认为他的软件包有什么错误<代码>dtplyr
包含
数据。表
据我所知。你的编辑与作者意图相冲突。@Tensibai Ops,我不知道
dtplyr
,我认为OP打错了。@nicola没问题。@RonakShah你说得对。我本可以在%c(“V4”、“V5”)中使用
colnames(x)%short@RonakShah是的,先生,你说得对。在这种情况下,
%在%c(“V4”、“V5”)
中应该是一个不错的选择。现在你可以用
imap(~.[is.numeric(.x)|.y!=“V3”])
替换
map2(名称(x),~.[is.numeric(.x)|.y!=“V3”])
。这有一个令人讨厌的副作用
all(col%in%.$V4)
并不等同于
col
实际上是
$V4
all(col=.$V4)
可能是更好的选择。@AlexR:谢谢。我来换。然而,我认为我关于
select_(如果
有一个糟糕的副作用:-)的整个答案是使用
select_at
一个更好的选择?在最后一个选项上只稍微短一点:x%>%select(c(它(sapply(,Is.numeric)),“V4”,“V5”)@RafaelToledo:x%>%select_at(vars(names(,[sapply(,Is.numeric)],“V4”,“V5”))
x = data.frame(V1=c(1,2,3),V2=c(10,11,12),V3=c('a','b','c'),V4=c('x','y','z'),V5=c('l', 'm','n'), stringsAsFactors=FALSE)
##  V1 V2 V3 V4 V5
##1  1 10  a  x  l
##2  2 11  b  y  m
##3  3 12  c  z  n
library(dplyr)
y <- x %>% select_if(function(col) is.numeric(col) | 
                                   all(col == .$V4) | 
                                   all(col == .$V5))
##  V1 V2 V4 V5
##1  1 10  x  l
##2  2 11  y  m
##3  3 12  z  n
y <- x %>% select(which(sapply(.,class)=="numeric"),V4,V5)
##  V1 V2 V4 V5
##1  1 10  x  l
##2  2 11  y  m
##3  3 12  z  n
x = data.frame(V1=c(1,2,3),V2=c(10,11,12),V3=c('a','b','c'),V4=c('x','y','z'),V5=c('l', 'm','n'))