【问题标题】:A particular syntactic construct in RR中的一个特殊句法结构
【发布时间】:2020-03-08 18:17:37
【问题描述】:

 Orders1=Orders[Datecreated<floor_date(send_Date,unit='week',week_start = 7)-weeks(PrevWeek),
                      .(Previous_Sales=sum(Sales)),
                      by=.(Category,send_Date=floor_date(send_Date,unit='week',week_start = 7))]

.(Previous_Sales=sum(Sales)) 中的. 是什么意思?这是我不熟悉的一些语法细微差别。

另外,by=.(Category,s.... 是什么意思? 有人可以帮忙吗?

【问题讨论】:

    标签: r syntax


    【解决方案1】:

    这里的. 类似于在data.table 中调用list。它正在创建一个汇总输出列

    .(Previous_Sales=sum(Sales))
    

    或者list

    list(Previous_Sales=sum(Sales))
    

    dplyr 中,类似的语法是

     summarise(Previous_Sales = sum(Sales))
    

    以及用于创建列/修改现有列的用户

     mutate(Previous_Sales = sum(Sales))
    

    使用data.table,使用:= 完成更新/创建列

     Previous_Sales := sum(Sales)
    

    同样,by 也将是列名的list

    by = list(Category, send_Date=floor_date(send_Date,unit='week',week_start = 7)
    

    我们也可以使用

    by = .(Category, send_Date=floor_date(send_Date,unit='week',week_start = 7)
    

    data.table的上下文中,语法顺序一致

      dt[i, j, by]
    

    其中i,是我们指定行条件的地方,j,我们在列/列和by分组列上应用函数。使用iris的简单示例

    as.data.table(iris)[Sepal.Length < 5, .(Sum = sum(Sepal.Width)), by = Species]
    

    iSepal.Length &lt; 5 它只选择满足条件的行到sum 'Sepal.Width' (在那些行中),并且由于提供了by 选项,它将执行@每个“物种”的“Sepal.Width”的 987654348@ 导致 3 行(这里有 3 个唯一的“物种”)。我们也可以在没有i 选项的情况下通过在j 本身中进行子集化来做到这一点

    as.data.table(iris)[, .(Sum = sum(Sepal.Width[Sepal.Length < 5])), by = Species]
    

    使用summariseation,这两个都可以,但是如果我们做一个作业(:=),那就不同了

     as.data.table(iris)[Sepal.Length < 5,  Sum := sum(Sepal.Width), by = Species]
    

    这将创建一个“Sum”列,并仅在“Sepal.Length and all other row elements will beNA”处填充sum 值。如果我们做第二个选项

    as.data.table(iris)[,  Sum := sum(Sepal.Width[Sepal.Length < 5]), by = Species]
    

    不会有任何 NA 元素,因为它在 j 内进行子集化,以便为每个“物种”创建单个 sum

    【讨论】:

    • 谢谢。该语句以 Orders1=Orders[,, by = ...] 开头,在此语句的上下文中,我不太明白您的答案。如果没有 group_by,如何使用 summarise?这 ”。”似乎指的是什么……你指的是什么清单?它在语句的上下文中有何意义?
    • @user2371765 关于list,data.frame、data.table/tbl_df 等都是具有相同长度的元素(列)的列表。 summarise 也可以在没有 group_by 的情况下使用。即iris %&gt;% summarise(Sum = sum(Sepal.Length))
    • @user2371765 在您的示例中,没有连接,您指定i 条件Datecreated&lt;floor_date(send_Date,unit='week',week_start = 7)-weeks(PrevWeek) 即仅对于那些满足条件的选定行,添加“销售”元素@987654365 @ 并且这是针对 Category,send_Date=floor_date(send_Date,unit='week',week_start = 7) 组的每个组合完成的,并且由于 sum 输出是单个元素,因此每个组组合都会得到一行
    • @user2371765 考虑 iris 数据集,as.data.table(iris)[Sepal.Length &lt; 5, .(Sum = sum(Sepal.Width)), by = Species]。在这里,它添加了“Sepal.Width”,其中每个“物种”的Sepal.Length 元素小于 5。也可以写成as.data.table(iris)[, .(Sum = sum(Sepal.Width[Sepal.Length &lt; 5])), by = Species]
    • @user2371765 基于表达式,您将“日期”按“周”放置并将其用作分组变量。如果您可以将其作为新问题发布,那就太好了,因为细节不清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多