R dpylr如果有多个条件,则选择
我想选择所有的数值变量以及一些变量的名称。我已经设法使用select_if来获取数值变量,并选择按名称获取变量,但无法将两者合并为一个语句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
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'))