【问题标题】:Multiple conditionals with %>%带有 %>% 的多个条件
【发布时间】:2019-01-31 12:41:14
【问题描述】:

这似乎是一个应该在 stackoverflow/google 中的问题,但它不是(或者至少我找不到它)所以我会在这里问它:

可重现的例子:

colnames(df)
"Z1"   "Z2"   "Z3"   "GV1"  "GV2"  "GV3"  "GV4"  "GV5"  "GV6"  "GV7"  "GV8"  "GV9" "GVY"  "EN1" "EN2"  "EN3"  "EN4"  "EN5"  "EN6"  "EN7"  "EN8"  "EN9"  "ENY"  "PV1"  "PV2"  "PV3"  "PV4"  "PV5"  "PV6"  "PV7"  "PVY" 

我正在尝试理解/执行下一个代码:

colnames(df[substr(colnames(df),start=1,stop=2) == "GV" & substr(colnames(df),start=3,stop=3) != "Y"])

使用 magrittr 管道运算符 %>%,因为我喜欢将它用于更易读的代码(这可行):

library(magrittr)
df %>%
  colnames %>%
    substr(start=1,stop=2) == "GV"

但是,这样做没有意义(这不起作用):

df %>%
  colnames %>%
    substr(start=1,stop=2) == "GV" & substr(colnames(df),start=3,stop=3) != "Y"]

有什么想法吗?

【问题讨论】:

  • 你的最终目标是什么?
  • 请在您的问题中提供minimal reproducible example
  • 您是否尝试过将substr(colnames(df),start=3,stop=3) != "Y" 中的colnames(df) 替换为.(以及删除最后的])?
  • 最终目标是简化代码。用magrittr代码做第一行代码是最终目标。
  • 你试过select()contains()starts_with()的组合吗?

标签: r conditional magrittr


【解决方案1】:

如果您的目标是简化代码,那么您可以使用正则表达式:

# Match string that starts with GV and is not fallowed by Y
grep("^GV[^Y]", foo, value = TRUE)
# [1] "GV1" "GV2" "GV3" "GV4" "GV5" "GV6" "GV7" "GV8" "GV9"

# Data
foo <- c("Z1", "Z2", "Z3", "GV1", "GV2", "GV3", "GV4", "GV5", "GV6", "GV7", "GV8", "GV9", "GVY", "EN1", "EN2", "EN3", "EN4", "EN5", "EN6", "EN7", "EN8", "EN9", "ENY", "PV1", "PV2", "PV3", "PV4", "PV5", "PV6", "PV7", "PVY")

【讨论】:

  • @chris 答案有效吗?或者有什么办法可以改进吗?
【解决方案2】:

我想要一个更可重现的例子,也就是说,您是否尝试过拆分过滤器?

df %>%
  colnames %>%
    substr(start=1,stop=2) == "GV"  %>%
       substr(colnames(df),start=3,stop=3) != "Y"

【讨论】:

    【解决方案3】:

    使用@Pogibas 的数据,您可以使用{ 编写这样的命令:

    foo %>% {substr(.,start=1,stop=2) == "GV" & substr(.,start=3,stop=3) != "Y"}
    # [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    # [19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2019-12-23
      • 2018-12-22
      • 2016-02-03
      • 1970-01-01
      相关资源
      最近更新 更多