пересечение dplyr выберите помощников - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу указать выбор столбцов элемента data.frame для dplyr xxxx_at функций с помощью аргумента .vars. Но я хочу выбрать пересечение моих выборов.

Вот пример: data.frame с именами вида [abc][abc][abc].

df <- structure(list(aaa = 1L, baa = 2L, caa = 3L, aba = 4L, bba = 5L, 
    cba = 6L, aca = 7L, bca = 8L, cca = 9L, aab = 10L, bab = 11L, 
    cab = 12L, abb = 13L, bbb = 14L, cbb = 15L, acb = 16L, bcb = 17L, 
    ccb = 18L, aac = 19L, bac = 20L, cac = 21L, abc = 22L, bbc = 23L, 
    cbc = 24L, acc = 25L, bcc = 26L, ccc = 27L), class = "data.frame", row.names = c(NA, 
-1L))


# names(df)
# [1] "aaa" "baa" "caa" "aba" "bba" "cba" "aca" "bca" "cca" "aab" "bab" "cab" "abb" "bbb" "cbb" "acb" "bcb"
# [18] "ccb" "aac" "bac" "cac" "abc" "bbc" "cbc" "acc" "bcc" "ccc"

Я хочу выбрать за один раз , столбцы начинаются с "a" и и заканчиваются "c". Чтобы использовать решение с mutate_at, group_by_at, and_so_on_at, оно должно соответствовать одному вызову vars.

.

Использование нескольких условий в vars принимает их объединение, а не пересечение.

df %>% 
select_at(vars(starts_with("a"), end_with("c"))) %>%
names

# [1] "aaa" "aba" "aca" "aab" "abb" "acb" "aac" "abc" "acc" "bac" "cac" "bbc" "cbc" "bcc" "ccc"

Я пытаюсь получить:

[1] "aac" "abc" "acc"

У меня ощущение, что all_vars актуально, но я не мог понять, как его использовать.

PS: я знаю, что могу использовать select вместо select_at, но я пытаюсь быть общим. Мой фактический вариант использования: mutate_at.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018
grep("^a.*c$", names(df), value = TRUE)

#[1] "aac" "abc" "acc"

если вы настаиваете на использовании dplyr

df %>% 
    select_at(vars(matches("^a.*c$"))) %>%
    names

#[1] "aac" "abc" "acc"
0 голосов
/ 09 ноября 2018

starts_with и ends_with оба оценивают позиции столбца. Таким образом, они оба возвращают числа, которые представляют индексы столбцов. Если вы хотите применить оба одновременно, вы хотите пересечение индексов столбцов, которые возвращаются обеими функциями. Это можно сделать, вызвав intersect для возвращаемых значений starts_with и ends_with:

df %>% 
  select_at(vars(intersect(starts_with("a"), ends_with("c")))) %>%
  names
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...