假设我有以下数据框:
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()
一起完成吗?
答案 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版本的select
,select_
:
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)))))