Несколько условных выражений с%>% - PullRequest
0 голосов
/ 31 января 2019

Похоже, это вопросы, которые должны быть в 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"]

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Если ваша цель - упростить код , тогда вы можете использовать регулярные выражения:

# 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")
0 голосов
/ 31 января 2019

Используя данные @ 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
0 голосов
/ 31 января 2019

Мне бы хотелось иметь более воспроизводимый пример, в котором говорилось, вы пытались разделить фильтры?

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