【问题标题】:column name with brackets or other punctuations for dplyr group_bydplyr group_by 的带括号或其他标点符号的列名
【发布时间】:2019-01-11 01:42:28
【问题描述】:

我有一个导入的数据框,它的列名带有各种标点符号,包括括号,例如BILLNG.STATUS.(COMPLETED./.INCOMPLTE).

我试图使用dplyr 中的group_by 来做一些总结,比如

df <- df %>% group_by(ORDER.NO, BILLNG.STATUS.(COMPLETED./.INCOMPLTE))

这会带来错误Error in mutate_impl(.data, dots) : could not find function "BILLNG.STATUS."

不改变列名,有没有办法直接在group_by处理这样的列名?

【问题讨论】:

  • 句点是合法的,但斜线(除法运算符)和括号不合法。您可能需要将名称括在引号中。您可能会考虑使用不同的流程来导入数据,或者注意在导入后立即构建有效的列名。
  • 是的,IRL 我清理了列名。如果dplyr 可以处理括号和斜线,或者它是绕过其他预处理的限制,我更感兴趣。
  • 我尝试了所有我能想到的方法并不断出错
  • 你试过group_by_("ORDER.NO, BILLNG.STATUS.(COMPLETED./.INCOMPLTE")吗?
  • @RichardScriven 没用。

标签: r dplyr


【解决方案1】:

我认为如果您将“非法”列名括在反引号中,您就可以完成这项工作。例如,假设我从这个数据框开始(称为df):

  BILLING.STATUS.(COMPLETED./.INCOMPLETE) ORDER.VALUE.(USD)
1                                       A        0.01544196
2                                       A        0.95522706
3                                       B        1.13479303
4                                       B        1.22848285

那我可以这样总结:

dat %>% group_by(`BILLING.STATUS.(COMPLETED./.INCOMPLETE)`) %>% 
  summarise(count=n(),
            mean = mean(`ORDER.VALUE.(USD)`))

给予:

  BILLING.STATUS.(COMPLETED./.INCOMPLETE) count      mean
1                                       A     2 0.4853345
2                                       B     2 1.1816379

反引号也可以方便地引用或创建带有空格的变量名。您可以在 SO 上找到许多与dplyr 和反引号相关的问题,并且在Quotes 的帮助中也有一些关于反引号的讨论。

【讨论】:

  • 谢谢,这对group_byselect 都有效。当我将其进一步带入 summarise 中的公式时,我绊倒了,即 orders.n %&gt;% group_by(ORDER.NO) %&gt;% summarize(total=sum(ORDER.VALUE.(USD))) ,这可以理解地导致错误 Error in sum("1603") : invalid 'type' (character) of argument 。但我猜这已经超出了这个问题的范围。
  • 以上显示了我如何不知道如何将反引号括在 SO 上的反引号中(请参阅未着色的 ORDER.VALUE.(USD) )...
  • 只要非法变量名包含在反引号中,我就不会收到错误消息。我已经更新了我的答案来解决这个问题。
【解决方案2】:

我只是将这个非答案用作反例或说明反引号方法的限制。 (这是我尝试的第一个策略。也许是两个语言操作(“(”和“/”)被相邻处理的事实导致了这个失败。)

names(iris)[5] <- "Specie(/)s"
library(dplyr)
by_species <- iris %>% group_by(`Specie(/)s`)
by_species %>% summarise_each(funs(mean(., na.rm = TRUE)))
#Error: cannot modify grouping variable

quoteas.namesubstitute 尝试了各种或其他面向语言的努力,但也失败了。 (我希望有一种机制可以要求将其置于答案的底部。)

【讨论】:

  • 当我在我的答案中使用的数据框上尝试 summarise_each 时,我得到了同样的错误。我想知道这是否失败不是因为您使用了特定的非法字符,而是因为 . 代词未设置为处理非法列名。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2014-11-13
  • 2014-05-15
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多