我有一些看起来像这样的数据
data(iris)
iris %>%
select(Species, everything()) %>%
rename(Y = 1) %>%
rename_at(vars(-c(1)), ~str_c("X", seq_along(.)))
数据:
Y X1 X2 X3 X4
1 setosa 5.1 3.5 1.4 0.2
2 setosa 4.9 3.0 1.4 0.2
3 setosa 4.7 3.2 1.3 0.2
4 setosa 4.6 3.1 1.5 0.2
5 setosa 5.0 3.6 1.4 0.2
6 setosa 5.4 3.9 1.7 0.4
我添加了一个随机变量:
d$noise <- rnorm(length(d))
我试图(动态地)仅提取Y, X1, X2... XN
变量。我目前拥有的是:
d %>%
select("Y", cat(paste0("X", seq_along(2:ncol(.)), collapse = ", ")))
这不起作用,因为它考虑了noise
列,即使没有noise
列也不起作用。
因此,我试图创建一个仅提取Y, X1, X2...XN
列的新数据框。
答案 0 :(得分:3)
dplyr提供了两个select helper functions,您可以将--- contains
用于文字字符串或matches
用于正则表达式。
在这种情况下,您可以
d %>%
select("Y", contains("X"))
或
d %>%
select("Y", matches("X\\d+"))
第一个在您提供的示例中有效,但是如果您有其他包含“ X”字符的变量,则第一个将失败。第二个更健壮,因为它将仅捕获名称为“ X”后跟一个或多个数字的变量。
答案 1 :(得分:1)
我们也可以使用
d %>%
select(Y, starts_with('X'))