select 以编程方式包含字符串的列名
select column names containing string programmatically
给定如下数据框:
df <- data.frame(z_a = 1:2,
z_b = 1:2,
y_a = 3:4,
y_b = 3:4)
我可以 select 包含以下字符的列名称:
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
的列之前
我想要 select 包含向量中的字符的列名称 并重新排序列。
searchfor <- letters[1:2]
使用 searchfor
,我想创建以下表达式并在 select
语句中使用它:
E <- quote(contains(searchfor[1]), contains(searchfor[2]))
df %>% select_(E)
purrr 解决办法:
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 %>%
select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
select(order(sub(".*_", "", names(.))))
自我回答 - 这是一个 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
我不明白确切的要求,但这是解决方案。
select(df, matches("a|b"))
给定如下数据框:
df <- data.frame(z_a = 1:2,
z_b = 1:2,
y_a = 3:4,
y_b = 3:4)
我可以 select 包含以下字符的列名称:
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
我想要 select 包含向量中的字符的列名称 并重新排序列。
searchfor <- letters[1:2]
使用 searchfor
,我想创建以下表达式并在 select
语句中使用它:
E <- quote(contains(searchfor[1]), contains(searchfor[2]))
df %>% select_(E)
purrr 解决办法:
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 %>%
select_at(vars(matches(paste(searchfor, collapse="|")))) %>%
select(order(sub(".*_", "", names(.))))
自我回答 - 这是一个 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
我不明白确切的要求,但这是解决方案。
select(df, matches("a|b"))