Конкретная конструкция syntacti c в R - PullRequest
1 голос
/ 08 марта 2020

In

 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))]

Что означает . in .(Previous_Sales=sum(Sales))? Это какой-то синтаксический c нюанс, с которым я не знаком.

Кроме того, что by=.(Category,s.... Может ли кто-нибудь помочь?

1 Ответ

1 голос
/ 08 марта 2020

Здесь . похоже на вызов list в data.table. Он создает итоговый выходной столбец

.(Previous_Sales=sum(Sales))

Или с list

list(Previous_Sales=sum(Sales))

В dplyr аналогичный синтаксис будет

 summarise(Previous_Sales = sum(Sales))

и для создание столбца / изменение существующего столбца. usee

 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]

, i равен Sepal.Length < 5, он выбирает только те строки, удовлетворяющие этому условию, для sum Sepal.Width (в этих строках), и так как предоставляется опция by, она будет делать sum из Sepal.Width для каждого «вида», в результате чего будет 3 строки (здесь есть 3 уникальных «вида»). Мы также можем сделать это без опции i, выполнив поднабор в самом j

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

С summarise, оба эти параметра в порядке, но если мы выполним задание (:=), он будет другим

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

Это создаст столбец «Сумма» и заполнит значения sum только там, где «Sepal.Length <5 <code>and all other row elements will be NA». Если мы сделаем второй параметр

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

, то элемента NA не будет, потому что он поднабора в пределах j создает одно значение sum для каждого «вида»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...