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

Posted

技术标签:

【中文标题】使用 dplyr::select() 以数字为名称选择多个列【英文标题】:Select multiple columns with dplyr::select() with numbers as names 【发布时间】:2016-10-31 19:21:26 【问题描述】:

假设我有以下数据框:

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 之间,并且标签是 1 之间的数字强>和99select() 可以一次性完成吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

有没有办法获得类似1:99,即使第 99 列不在此特定数据集中? @Theodor 不是直接的,而是使用函数select_ 可以将列名数组传递给它,因此您可以执行select_(.dots = colnames(dd)[colnames(dd) %in% as.character(1:99)]) 之类的解决方法【参考方案2】:

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

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

【讨论】:

以上是关于使用 dplyr::select() 以数字为名称选择多个列的主要内容,如果未能解决你的问题,请参考以下文章

根据dplyr :: select兼容的类/类型选择列

将 plyr::mapvalues 与 dplyr 一起使用

JSON 字段名称可以以数字开头吗?

提取R数据框中除数字以外的所有列[重复]

在转换为 XML 之前更改 JSON 对象中的属性名称

R中的标准评估和非标准评估