【问题标题】:select column names containing string programmatically以编程方式选择包含字符串的列名
【发布时间】:2017-12-13 07:20:54
【问题描述】:

给定一个像这样的数据框:

df <- data.frame(z_a = 1:2,
                 z_b = 1:2,
                 y_a = 3:4,
                 y_b = 3:4)

我可以选择包含以下字符的列名称:

library(dplyr)
df %>% select(contains("a"), contains("b"))

  z_a y_a z_b y_b
1   1   3   1   3
2   2   4   2   4

注意 列顺序已更改。包含a 的列位于包含b 的列之前

我想选择在向量中包含字符的列名并重新排序列。

searchfor <- letters[1:2]

使用searchfor,我想制作以下表达式并在select 语句中使用它:

E <- quote(contains(searchfor[1]), contains(searchfor[2]))
df %>% select_(E) 

【问题讨论】:

标签: r select quote expr


【解决方案1】:

我们可以的

df %>% 
   select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
   select(order(sub(".*_", "", names(.))))

【讨论】:

  • 不是我想要的行为。 df %&gt;% select(contains("a"), contains("b")) 改变了列的顺序,这是我想要的输出。我会在我的帖子中说清楚。
  • 谢谢。现在我需要弄清楚你做了什么。
  • @ChiPak 在第一个select 中,我使用了一个正则表达式来提取那些列,然后删除子字符串,根据它排序并选择列。感谢您的来信
  • 第二个只有在我想要字母顺序时才有效,对吗?如果我想要任意排序(由searchfor 的顺序确定),在这种情况下它不会起作用?
  • @ChiPak 一般情况下,您可以添加factorlevels
【解决方案2】:

咕噜解决办法:

library(purrr)
ind_lgl <- map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
  pmap_lgl(`|`)

df[ind_lgl]

用管子:

df %>%
  `[`(map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
        pmap_lgl(`|`))

如果你得到正确的顺序:

rank <- map(letters[1:2], ~ grepl(.x, names(df), fixed = TRUE)) %>%
  pmap(c) %>%
  map(which)


ind_chr <- data_frame(colnames = names(df), rank) %>%
  mutate(l = lengths(rank)) %>%
  filter(l > 0) %>%
  mutate(rank = unlist(map(rank, ~ .x[[1]]))) %>%
  arrange(rank) %>%
  pull(colnames)


df[ind_chr]

但它并不漂亮......

【讨论】:

  • 不是我想要的行为。 df %&gt;% select(contains("a"), contains("b")) 改变了列的顺序,这是我想要的输出。应该在我的帖子中更清楚地说明这一点
  • 不漂亮...但无论如何对我学习很有用。你赢得了我的支持......
【解决方案3】:

自我回答 - 这是select_ 的解决方案,但仍然使用contains - 以防万一其他人感兴趣:

library(iterators)
library(dplyr)
s <- paste0("c(", paste0(sapply(iter(searchfor), function(x) paste0("contains(\"", x, "\")")), collapse=","), ")")
df %>% select_(., s)

  z_a y_a z_b y_b
1   1   3   1   3
2   2   4   2   4

【讨论】:

    【解决方案4】:

    我不明白确切的要求,但这是解决方案。

    select(df, matches("a|b"))
    

    【讨论】:

    • 关闭...我想要的两件事。首先,使用字符元素向量searchfor 作为selectcontains 的参数。您在声明中没有使用searchfor。其次,语句应该根据匹配对列重新排序,这样searchfor 的顺序应该决定输出的列顺序。
    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2016-07-17
    • 2017-09-24
    • 2021-12-01
    相关资源
    最近更新 更多