dplyr选择助手的交集

3
我想要指定一个数据框的列选择给dplyrxxxx_at 函数,通过.vars参数。但是我想要选择我的选择交集。
以下是一个示例:一个名称形如[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_atgroup_by_atand_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个回答

4

starts_withends_with都评估列位置。因此,它们都返回代表列索引的数字。如果您想同时应用两者,则需要返回由这两个函数返回的列索引的交集。您可以通过在starts_withends_with的返回值上调用intersect来实现这一点:

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

4
grep("^a.*c$", names(df), value = TRUE)

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

如果您坚持使用dplyr

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

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

1
谢谢Andre!我坚持使用dplyr--问题的重点不在于提取名称,而在于将相关列选择传递给xxxx_at。我只是用names来说明。 - asachet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接