使用dplyr::select()选择多列具有数字名称的列

14

假设我有以下数据框:

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()会尝试以此方式按位置选择列。
我希望能够获取一个数据框,其中包含介于af之间的所有列,以及标签为介于199之间的数字的列。 是否可以使用select()一次完成这个操作?
2个回答

17

开始于数字的列名,比如你的数据中的 "1" 和 "8",不是语法上有效的名称(请参见?make.names)。然后请参阅?Quotes中的'Names and Identifiers'一节:“可以使用其他[语法无效]名称,只要它们被引用。首选报价是反引号。”

因此,请用反引号 (`) 将无效的列名括起来:

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

另一种选择是使用 select_的SE版本,select_:

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

是否有一种方法可以像 1:99 这样的东西,即使第 99 列不在这个特定的数据集中? - Theodor
@Theodor 不是直接的,但是你可以使用函数 select_ 并传递一个列名数组,这样你就可以像这样做:select_(.dots = colnames(dd)[colnames(dd) %in% as.character(1:99)]) 作为一种解决方法。 - AlexR

6
我们可以选择a:f列,并通过将列名转换为数字来添加数值列的索引:
dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接