如何处理非标准列名(空格、标点符号、以数字开头)

How to deal with nonstandard column names (white space, punctuation, starts with numbers)

提问人:Flux 提问时间:4/3/2014 最后编辑:Gregor ThomasFlux 更新时间:8/28/2023 访问量:59363

问:

df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")

数据如下所示

  a a a b
1   1   2
2   2   3
3   3   4

以下调用选择

select(df, 'a a')

Error in abs(ind[ind < 0]) : 
  non-numeric argument to mathematical function

如何使用“a a”和/或将其重命名为没有空格的内容?我知道以下方法:select

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

但是,如果我正在处理一个大型数据集,我怎么能在不知道索引数字或类似列名的情况下获得完全匹配呢?

DPLYR R-常见问题

评论


答:

83赞 Henrik 4/3/2014 #1

您可以使用反引号来创建变量。select`

select(df, `a a`)
#   a a
# 1   1
# 2   2
# 3   3

但是,如果您的主要目标是重命名列,则可以在包中使用,您可以在其中同时使用 和 。renameplyr""``

rename(df, replace = c("a a" = "a"))
rename(df, replace = c(`a a` = "a"))

或者在 R 中:base

names(df)[names(df) == "a a"] <- "a"

有关各种引号用法的更详尽说明,请参见。“名称和标识符”部分在这里尤为重要:?Quotes

可以使用其他 [语法无效] 名称,前提是它们被引用。首选报价是反引号”。

另请参阅有关有效名称的信息。?make.names

另请参阅这篇关于重命名的帖子dplyr

评论

2赞 Arun 4/4/2014
您也可以对以下方法执行相同的操作:selectselect(df, a=`a a`)
0赞 Henrik 4/4/2014
@Arun,感谢您的建议。但是,这难道不是既重命名了“a a”,只选择了这个变量(与 )相反吗?rename
0赞 Arun 4/4/2014
亨里克,你是对的。但是会复制整个 data.frame 只是为了重命名列。所以,我不会使用它/认为它有效。我不确定是否有像这样的方法.例如:通过引用在此处重命名。renamesetattrdata.tablesetattr(df, 'names', c("a", "b"))
4赞 Andy 10/4/2016 #2

反引号的一些替代方案,从 dplyr 0.5.0 开始很好,截至撰写本文时的当前版本。

如果您尝试以编程方式选择参数作为列,并且不想重命名或将 / 列名重命名为反引号,则可以与 的非标准评估版本结合使用,该版本是:pastesprintfas.nameselectselect_

dplyr::select_(df, as.name("a a"))

许多功能都有非标准版本。具体来说,您还可以将标准版本与 select helper 结合使用。有关文档,请参阅:dplyrselectone_of?dplyr::select_helpers

dplyr::select(df, dplyr::one_of("a a"))

评论

0赞 krthkskmr 6/8/2017
这是不正确的。甚至 dplyr 的 NSE 版本也无法处理它。例如:这将返回一个错误。colnames(mtcars)[1] <- "Miles Per Gallon"mtcars %>% select_("Miles Per Gallon")
4赞 Andy 6/10/2017
mtcars %>% select_(as.name("Miles Per Gallon"))工程。
0赞 Mark 8/28/2023 #3

截至 2023 年,之前给出错误的代码现在运行:

> select(df, 'a a')
  a a
1   1
2   2
3   3

因此,对于“如何处理非标准列名”这个问题,一个合理的答案是,现在,将它们写成字符串(对于选择,这是开箱即用的,但对于mutate,你需要使用类似的东西mutate(df, a = .data[['a a']])