Выбор столбцов с фиксированным рисунком в начале и конце имени и переменной средней части - PullRequest
1 голос
/ 03 апреля 2020

Я хочу select столбцы фрейма данных, которые имеют определенный шаблон в начале и конце своих имен и одно из нескольких возможных значений в середине. Это то, что работает, но я считаю, что двойное использование intersect не очень элегантно.

df <- data.frame(var1_one_num = sample(1:10, 10, replace = TRUE),
                 var1_two_num = sample(1:10, 10, replace = TRUE),
                 var1_three_num = sample(1:10, 10, replace = TRUE),
                 var1_four_num = sample(1:10, 10, replace = TRUE),
                 var2_one_num = sample(1:10, 10, replace = TRUE),
                 var1_one_fac = sample(1:10, 10, replace = TRUE))

var_middle <- c("one|two|three")

df %>% select(intersect(starts_with("var1_"),
                        intersect(matches(var_middle),
                                  ends_with("_num")))) %>% names()

[1] "var1_one_num"   "var1_two_num"   "var1_three_num"

Я подозреваю, что есть более умный способ с any of или подобным, но я не мог обойти это.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

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

> grep(pattern = '^var1.*(one|two|three).*num$', x = colnames(df), value = T)
[1] "var1_one_num"   "var1_two_num"   "var1_three_num"

знак ^ указывает, что строка должна начинаться с этого шаблона, $ обозначает чем должна заканчиваться строка Круглая скобка с разделителем | указывает, что любое из этих значений является приемлемым.

Чтобы получить значения столбцов:

> df[, grep(pattern = '^var1.*(one|two|three).*num$', x = colnames(df), value = T)]
   var1_one_num var1_two_num var1_three_num
1             9            1              7
2             2           10              4
3             2            9              1
4             1            5              4
5             4            9             10
6             6            8              8
7             9            5              7
8             6            2              6
9             5            3              5
10            1            1              7

Если вы не знакомы с регулярным выражением, вот хорошая ссылка, чтобы узнать больше: https://cran.r-project.org/web/packages/stringr/vignettes/regular-expressions.html

Надеюсь, это полезно!

0 голосов
/ 09 апреля 2020

Это ответ @tmfmnk, который я предложил ему опубликовать, но пока нет. Поскольку я хотел что-то в dplyr, это то, что я искал:

df %>% select(matches("^var1_(one|two|three)_.*num$"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...