【问题标题】:Why am I getting an 'Error in UseMethod(arrange) in r?为什么我在 r 中收到“UseMethod(arrange) 错误”?
【发布时间】:2022-01-01 23:35:24
【问题描述】:

我正在编写一个列出各种商品的销售价格的 r 程序。我有一个名为 InvoiceDate 的列,其中列出的日期和时间如下:'12/1/2009 7:45'。我试图仅将日期隔离在一个名为日期的单独字段中,然后按顺序排列日期。我使用的代码如下:

library(dplyr)
library(ggplot2)

setwd("C:/Users/cshor/OneDrive/Environment/Restoration_Ecology/Udemy/Stat_Thinking_&_Data_Sci_with_R/Assignments/Sect_5")
retail_clean <- read.csv("C:/Users/cshor/OneDrive/Environment/Restoration_Ecology/Udemy/Stat_Thinking_&_Data_Sci_with_R/Data/retail_clean.csv")

retail_clean$date <- as.Date(retail_clean$InvoiceDate)#, format = "%d/%m/%Y")

   total_sales = sum(retail_clean$Quantity, na.rm=TRUE) %>% 
arrange(retail_clean$date) %>% ggplot(aes(x=date, y=total_sales)) + geom_line()

最初,一切正常,并且创建了日期字段。但是,我收到了安排()函数的以下错误:

Error in UseMethod("arrange") :no applicable method for 'arrange' applied to an object of class "c('integer', 'numeric')"

我已经搜索了一个多星期来寻找解决此问题的方法,但没有找到任何专门解决此问题的方法。我还使用了 '.asPosixct' 而不是 .asDate,结果相似。对于程序为何将日期数据解释为数字以及如何纠正问题的任何帮助,将不胜感激。

【问题讨论】:

  • 尝试:library(lubridate),然后将..改为arrange(dmy(retail_clean$date))
  • 谢谢你的评论,鬣狗。我试图通过这种方式推理,但无济于事。请让我知道此信息是否有用:在'retail_clean$date

标签: r function dplyr data-science


【解决方案1】:

首先,错误消息与日期时间无关。

让我们看看你提供的代码:

total_sales = sum(retail_clean$Quantity, na.rm=TRUE) %>% 
arrange(retail_clean$date) %>% ggplot(aes(x=date, y=total_sales)) + geom_line()

在您的情况下,sum(retail_clean$Quantity, na.rm=TRUE) 这个术语的结果是一个整数,它通过管道传递到 dpyr::arrange 函数的第一个参数中,该函数调用 UseMethod("arrange")

然后,管道参数被检查为integernumeric类的对象,而arrange没有这些类的方法,即arrange.integerarrange.numeric都没有定义。因此错误消息。您的日期转换没有任何问题,只是您确实需要您在代码示例中注释掉的 format 术语。

解决方案也很简单。将sum 更改为返回data.framearrange 知道的其他类的内容。你可以查看arrange有哪些方法可用:

$>methods(dplyr::arrange)
[1] arrange.data.frame*

在这个R实例中,你只能通过arrange放一个data.frame对象,但是你总是可以为其他类定义具体的方法。

看起来这是一个 Udemy 课程作业。也许在这里您需要计算每天或每月的总和,无论您的任务要求您做什么,但sum 绝对不是正确的答案。

顺便说一句,欢迎来到 SO!

更新: 一个例子

n <- 100
data <- data.frame(sales = runif(n), day = sample(1:30, n, replace = TRUE))
data$date_ <- paste0(data$day, "/1/2009 7:45")
head(data$date_) # This is the orignial date string
data$date <- as.Date(data$date_, format = "%d/%m/%Y")
head(data$date) # Check here to see the formated date

library(dplyr)
library(ggplot2)
data %>% 
    group_by(date) %>% 
    summarise(totalSale = sum(sales, na.rm=TRUE)) %>%
    arrange(date) %>%
    ggplot(aes(x = date, y = totalSale)) +
    geom_line()

这是剧情

看起来不错,不是吗?现在所有的销售都是按日期排序的。

【讨论】:

  • 感谢您的反馈。我尝试了arrange.data.frame和arrange(data.frame ...),它们都返回错误。第一个说找不到arrange.data.frame,第二个又回来了同样的老错误。使用 lubridate 也会产生原始错误。
  • 我使用的是 RStudio 4.1。该代码来自 Udemy 课程,但讲师可能使用的是 3.x。他只是简单地运行了安排(日期),它工作得很好。我厌倦了在这些每周版本都在变化的开源课程上浪费时间,以前可以做的事情现在不能​​做。顺便说一句,我也使用了retail_clean$date
  • 没有。您不直接使用未导出的arrange.data.frame。只需使用普通的arrange 函数。我在原始答案中添加了一个示例代码示例。
  • 我不会使用 Udemy 来学习 R。试试 edx 上的那些开始吧。要真正理解 R,您需要阅读文档页面。关于编程的事情是一切都是确定性的。事情的发生是有原因的。不要漫无目的地尝试不同的东西。首先尝试了解根本原因。
猜你喜欢
  • 2023-01-20
  • 1970-01-01
  • 2018-10-08
  • 2015-04-12
  • 2022-01-09
  • 2012-06-16
  • 1970-01-01
  • 2020-11-05
  • 2015-01-30
相关资源
最近更新 更多