简体   繁体   English

在dplyr中选择时,使用negated ends_with和starts_with

[英]Using negated ends_with together with starts_with when selecting in dplyr

Say I have this data frame: 说我有这个数据框:

df <- data.frame(foo = runif(10), bar = runif(10), boo = runif(10))

#          bar       boo        foo
# 1  0.9561519 0.2152603 0.90986454
# 2  0.9971676 0.8101082 0.78158207
# 3  0.6211555 0.9281131 0.59828786
# 4  0.2332080 0.6063427 0.88131253
# 5  0.6572534 0.3698642 0.61227246
# 6  0.6940809 0.1464231 0.30366349
# 7  0.3924425 0.3706134 0.05930352
# 8  0.7918689 0.8808447 0.90571744
# 9  0.2553619 0.9632559 0.52549238
# 10 0.3772701 0.7657140 0.05102249

I can use starts_with and ends_with together when selecting a column like this: 在选择这样的列时,我可以一起使用starts_withends_with

df %>% 
  select(intersect(starts_with("b"), ends_with("oo")))

As expected, this gives the following: 正如所料,这给出了以下内容:

#          boo
# 1  0.2152603
# 2  0.8101082
# 3  0.9281131
# 4  0.6063427
# 5  0.3698642
# 6  0.1464231
# 7  0.3706134
# 8  0.8808447
# 9  0.9632559
# 10 0.7657140

I can also select columns that don't end in oo by negating ends_with , like this: 我也可以通过否定ends_with来选择不以oo结尾的列,如下所示:

df %>% 
  select(-ends_with("oo"))
#          bar
# 1  0.9561519
# 2  0.9971676
# 3  0.6211555
# 4  0.2332080
# 5  0.6572534
# 6  0.6940809
# 7  0.3924425
# 8  0.7918689
# 9  0.2553619
# 10 0.3772701

Now, I want to combine these behaviours. 现在,我想结合这些行为。 That is, I want a column that does not end with oo and starts with b . 也就是说,我想要一个oo结尾并以b开头的列。 So, in my example I should just get the column bar – but I don't. 所以,在我的例子中,我应该得到列bar - 但我没有。

df %>% 
  select(intersect(starts_with("b"), -ends_with("oo")))

# data frame with 0 columns and 10 rows

Above, I show that the intersect approach works and that the negation of ends_with also works, but combining these doesn't give the result I expect. 在上面,我表明intersect方法是有效的,并且对ends_with的否定也有效,但结合这些并不能给出我期望的结果。 Can someone enlighten me as to where I'm going wrong? 有人可以告诉我哪里出错了吗?


Edit : Actually, now that I rerun this in a fresh session I get, 编辑 :实际上,现在我在新的会话中重新运行了这个,

Error in UseMethod("select_") : no applicable method for 'select_' applied to an object of class "function" UseMethod(“select_”)中的错误:没有适用于“select_”的方法应用于类“function”的对象

Use setdiff : 使用setdiff

df %>% 
  select(setdiff(starts_with("b"), ends_with("oo")))

# bar
# 1  0.5248344
# 2  0.8835366
# 3  0.3486265
# 4  0.6382468
# 5  0.7378287
# 6  0.2878244
# 7  0.1927559
# 8  0.9787019
# 9  0.5393251
# 10 0.9229542

The negative notation is magic understood by select , it's not understood by intersect . 否定符号是由select理解的魔法,它不被intersect理解。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM