12

假设我有以下数据框:

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

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

我希望能够获得一个数据框,其中所有列都在af之间,并且标签的数字在199之间。这可以一次性完成select()吗?

4

2 回答 2

15

以数字开头的列名,例如数据中的“1”和“8”,在语法上不是有效的名称(请参阅参考资料?make.names)。然后查看“名称和标识符”部分?Quotes:“可以使用其他 [语法无效] 名称,只要它们被引用。首选引号是反引号”。

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

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 版本的select, select_

dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))
于 2016-06-29T08:00:58.777 回答
5

We can select columns a:f, and add index of numeric columns by converting colnames to numeric:

dd %>% 
  select(a:f, which(!is.na(as.numeric(colnames(dd)))))
于 2016-06-29T08:18:28.547 回答