【问题标题】:Aggregate function in r is not working on my datasetr 中的聚合函数不适用于我的数据集
【发布时间】:2018-02-22 19:35:00
【问题描述】:

样本数据集

日期 Playerid 收入促销 DayofWeek
01/01/2017 146123 0 B 星期日
01/01/2017 219378 0 B 星期日
01/01/2017 198614 0 B 星期日
02/01/2017 292640 30 A 星期一
02/01/2017 139562 10 A 星期一
02/01/2017 124967 20 A 星期一
02/01/2017 107954 20 A 星期一
2017 年 3 月 1 日 28391 10 B 星期二
2017 年 3 月 1 日 184388 21 B 星期二
2017 年 3 月 1 日 264222 20 B 星期二
03/01/2017 184857 0 B 星期二
04/01/2017 79788 40 A 星期三

我想按 DayofWeek 聚合表格,并总结一周中每一天的收入,计算使用 playerid 的玩家数量,这样我的最终输出如下所示:

玩家收入促销 DayofWeek 3 0 B 星期日 4 80 星期一 4 51 B星期二 1 40 A 星期三

我一直在尝试汇总上面附加的数据集,但所有尝试均未成功。可以帮忙吗?

下面是我的代码。

aggdata <-aggregate(MyData, by=list(DayofWeek,Revenue, Promo, Playerid), 
                    FUN=sum, na.rm=TRUE)

我收到以下错误

Error in FUN(X[[i]], ...) : invalid 'type' (character) of argument

【问题讨论】:

    标签: r aggregate-functions


    【解决方案1】:

    dplyr 接近

    library(dplyr)
    ans <- df %>%
      group_by(DayofWeek) %>%
      summarise(Promo=unique(Promo), Revenue=sum(Revenue), Playerid=n())
    

    输出

      DayofWeek Promo Revenue Playerid
          <chr> <chr>   <int>    <int>
    1    Monday     A      80        4
    2    Sunday     B       0        3
    3   Tuesday     B      51        4
    4 Wednesday     A      40        1
    

    数据

    df <- structure(list(Date = c("01/01/2017", "01/01/2017", "01/01/2017", 
    "02/01/2017", "02/01/2017", "02/01/2017", "02/01/2017", "03/01/2017", 
    "03/01/2017", "03/01/2017", "03/01/2017", "04/01/2017"), Playerid = c(146123L, 
    219378L, 198614L, 292640L, 139562L, 124967L, 107954L, 28391L, 
    184388L, 264222L, 184857L, 79788L), Revenue = c(0L, 0L, 0L, 30L, 
    10L, 20L, 20L, 10L, 21L, 20L, 0L, 40L), Promo = c("B", "B", "B", 
    "A", "A", "A", "A", "B", "B", "B", "B", "A"), DayofWeek = c("Sunday", 
    "Sunday", "Sunday", "Monday", "Monday", "Monday", "Monday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Wednesday")), .Names = c("Date", 
    "Playerid", "Revenue", "Promo", "DayofWeek"), row.names = c(NA, 
    -12L), class = c("data.table", "data.frame"))
    

    【讨论】:

    • 感谢您的帮助。我尝试了您的解决方案,它适用于提供的少量数据样本。但是,当我加载与我之前提供的具有相似列的数据集时,这次包含 30,000 行,解决方案不起作用。我尝试这样做:MyData % group_by(DayofWeek) %>% summarise(Promo=unique(Promo), Revenue=sum(Revenue), Playerid=n()) View(ans) I
    • 我认为我的问题在于我加载数据的方式
    • 我得到的错误是 Summarise_impl(.data, dots) 中的错误:列 Promo 的长度必须为 1(汇总值),而不是 3。有关详细信息 MyData 具有以下结构,str (MylData)'data.frame':303345 obs。 5 个变量: $ Date : chr "01/01/2017" "01/01/2017" "01/01/2017" "01/01/2017" ... $ Playerid : int 146123 219378 28391 184388 264222 .. . $ 收入 : int 0 0 0 30 0 0 20 0 21 20 ... $ 促销 : chr "B" "B" "B" "B" ... $ DayofWeek: chr "Sunday" "Sunday" 。跨度>
    • 我也尝试过这个 df
    • 您的错误发生是因为您在每个 DayofWeek 有多个促销值。尝试按group_by(DayofWeek, Promo) 分组,然后总结summarise(Revenue=sum(Revenue), Playerid=n())
    【解决方案2】:

    这是因为您正在聚合除 Date 之外的所有内容,因此 sum 函数试图将这些日期字符串相加。尝试像这样对收入求和:

    aggdata <-aggregate(MyData, by=list(DayofWeek, Date, Promo, Playerid), 
                    FUN=sum, na.rm=TRUE)
    

    或者,根据您的说法,您想忘记日期:

    aggdata <-aggregate(. ~ Dayofweek + Promo + Playerid, data = MyData[,-2:5], sum)
    

    【讨论】:

    • 在尝试了你的建议后,我得到了以下错误 > aggdata
    • 我想按日期以外的所有列进行汇总
    • 在没有样本数据的情况下很难猜出确切的语法。请编辑您的问题以包含dput(MyData) 的输出。另外,我在最初显示后稍微更改了第二个公式:您使用的是编辑后的代码吗?
    • 哎呀:我知道现在你想使用MyData[,-2:5],而不是MyData[,-2:4]。修好了。
    • 示例数据作为图像文件的链接附加,文件名是我的问题页面顶部的“客户数据集”。感谢您的帮助。
    猜你喜欢
    • 2023-03-09
    • 2014-04-23
    • 2020-10-13
    • 2019-11-17
    • 2014-11-10
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多