使用带有数字作为名称的dplyr :: select()选择多个列

时间:2016-06-29 07:56:33

标签: r dplyr identifier illegal-characters

假设我有以下数据框:

a <- runif(10)
dd <- as.data.frame(t(a))
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8")

dplyr中,有一种很好的方法可以选择多个列。例如,要选择列 a 和列 f 之间的列,我可以使用

dd %>% dplyr::select(a:f)

在我的问题中,数据框最后一部分的列可能会有所不同,但它们的名称总是在1到99之间。但是,我似乎无法做到与上面相同的技巧:

> dd %>% select(1:99)
Error: Position must be between 0 and n
> dd %>% select("1":"99")
Error: Position must be between 0 and n

这是因为使用select()尝试以这种方式按位置选择列。

我希望能够获得包含 a f 之间所有列的数据框,以及标记为 1 99 。这可以与select()一起完成吗?

2 个答案:

答案 0 :(得分:10)

以数字开头的列名,例如&#34; 1&#34;和&#34; 8&#34;在您的数据中,不是语法上有效的名称(请参阅?make.names)。然后查看“姓名和标识符”&#39; ?Quoutes中的部分:&#34;如果引用它们,则可以使用其他[语法无效]名称。首选引用是反对&#34;。

因此,将无效列名包装在反引号(`)中:

dd %>% dplyr::select(a:f, `1`:`8`)

#           a        a2         b        b2          f         1         4         8
# 1 0.2510023 0.4109819 0.6787226 0.4974859 0.01828614 0.7449878 0.1648462 0.5875638

另一种选择是使用SE版本的selectselect_

dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))

答案 1 :(得分:3)

我们可以选择列a:f,并通过将colnames转换为numeric:

来添加数字列的索引
dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))