【问题标题】:dplyr: nonstandard column names (white space, punctuation, starts with numbers)dplyr:非标准列名(空格、标点符号、以数字开头)
【发布时间】:2014-05-15 13:16:31
【问题描述】:
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

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

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

但如果我正在处理大型数据集,我如何在不知道索引号或类似列名的情况下获得精确匹配?

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

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

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

    但是,如果您的主要目标是重命名该列,您可以在 plyr 包中使用 rename,在其中您可以同时使用 ""``

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

    或者在baseR:

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

    有关使用各种引号的更详细说明,请参阅?Quotes。 “名称和标识符”部分在这里特别重要:

    可以使用其他 [语法上无效的] 名称,只要它们被引用。首选引号是反引号”。

    另请参阅?make.names 了解有效名称。

    另请参阅this postdplyr 中有关重命名的信息

    【讨论】:

    • 你也可以用select做同样的事情:select(df, a=`a a`)
    • @Arun,感谢您的建议。但是这不是都重命名“a a”,只选择这个变量(与rename相反)?
    • 亨里克,你是对的。但是rename 将复制整个 data.frame 只是为了重命名列。所以,我不会使用它/认为它有效。我不确定data.table 中是否有类似setattr 的方法。例如:setattr(df, 'names', c("a", "b")) 在此处通过引用重命名。
    • 注意dplyr 中有一个函数rename 可以破坏plyr 函数。如果您真的想要plyr 版本,您可以使用plyr:::rename
    • 我经常收到电子表格来分析变量名称的类似问题。我做的第一件事就是使用 stringr 包中的 str_replace 来清理它们。例如,用句点替换空格。您对 base 的“make.names”的建议似乎是我将来会尝试的一个很好的解决方案。
    【解决方案2】:

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

    如果您尝试以编程方式选择一个参数作为列,并且您不想重命名或将列名称执行为类似paste/sprintf 的反引号,您可以将as.namenon-standard evaluation 版本的select,即select_

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

    许多dplyr 函数都有非标准版本。具体到select的情况下,还可以结合选择助手one_of使用标准版。有关文档,请参阅 ?dplyr::select_helpers

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

    【讨论】:

    • 这是不正确的。甚至 dplyr 的 NSE 版本也无法处理它。例如:colnames(mtcars)[1] &lt;- "Miles Per Gallon"mtcars %&gt;% select_("Miles Per Gallon") 这将返回一个错误。
    • mtcars %&gt;% select_(as.name("Miles Per Gallon")) 工作。
    【解决方案3】:

    您可以将间隔变量锁定在 Esc 下的“`”中。请注意,该标志与

    不同

    a b\

    【讨论】:

    • 嗨,S-V-P,欢迎来到 SO!如果你看到这个问题的其他答案,你可以看到一些很好的例子......真正完整的回答提供了关于 OP 面临的问题的一般信息以及具体的解决方案。我认为这可能更像是一个评论(我知道,新用户可能不会发布)而不是一个完整的答案。不过,我实际上建议在其他 SO 用户投票之前将其删除,因为我认为这不符合完整答案的站点标准。谢谢!
    猜你喜欢
    • 2022-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多