使用dplyr::Select()以数字作为名称选择多个列

使用dplyr::Select()以数字作为名称选择多个列,r,dplyr,identifier,illegal-characters,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") 在我的问题中,数据帧最后部分的列可能会有所不同,但它们的名称始终是一个介于1和99之间的数字。然而,我似乎不能像上面那样做: > dd %>% select(1:99) Error: Position must be bet

假设我有以下数据框:

a <- runif(10)
dd <- as.data.frame(t(a))
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8")
在我的问题中,数据帧最后部分的列可能会有所不同,但它们的名称始终是一个介于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()
尝试以这种方式按位置选择列


我希望能够获得一个所有列都在af之间的数据框,以及标签上的数字在199之间的数据框。是否可以用
select()
一次性完成?

以数字开头的列名,例如数据中的“1”和“8”,在语法上是无效的名称(请参见
?make.names
)。然后参见
?QUOTES
中的“名称和标识符”部分:“如果引用了其他[语法无效]名称,则可以使用它们。首选的引用是反勾号”

因此,将无效列名换行(
`
):

另一个选项是使用SE版本的
选择
选择

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

我们可以选择列a:f,并通过将colname转换为numeric来添加数字列的索引:

dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))

有没有一种方法可以让像
1
99
,即使列99不在这个特定的数据集中?@Theodor不直接,但使用函数
select\uu
可以向它传递一个列名数组,这样你就可以像
select\udots=colnames(dd)[colnames(dd in%as.character(1:99)]
作为解决方法
dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))
dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))