The*_*dor 7 r identifier illegal-characters dplyr
假设我有以下数据框:
a <- runif(10)
dd <- as.data.frame(t(a))
names(dd) <- c("ID", "a", "a2", "b", "b2", "f", "XXX", "1", "4", "8")
Run Code Online (Sandbox Code Playgroud)
在dplyr,有一个很好的方法来选择多个列.例如,要选择列a和列f之间的列,我可以使用
dd %>% dplyr::select(a:f)
Run Code Online (Sandbox Code Playgroud)
在我的问题中,数据框的最后一部分的列可能会有所不同,但它们的名称总是在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
Run Code Online (Sandbox Code Playgroud)
这是因为使用select()尝试以这种方式按位置选择列.
我希望能够获得包含a和f之间所有列的数据框,以及具有1到99之间数字的标签的数据框.这可以一起做select()吗?
Ale*_*exR 10
以数字开头的列名(例如数据中的"1"和"8")不是语法上有效的名称(请参阅参考资料?make.names).然后查看"名称和标识符"部分?Quoutes:"只要引用它们,就可以使用其他[语法无效]名称.首选引号是反引号".
因此,在backticks(`)中包装无效的列名:
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
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用的SE版本select,select_:
dd %>% dplyr::select_(.dots = c("a", "a2", ..., "1", "4", "8"))
Run Code Online (Sandbox Code Playgroud)
我们可以选择列 a:f,并通过将列名转换为数字来添加数字列的索引:
dd %>%
select(a:f, which(!is.na(as.numeric(colnames(dd)))))
Run Code Online (Sandbox Code Playgroud)