Распространение данных в новые столбцы, а также суммирование (добавление) значений - R или SQL - PullRequest
0 голосов
/ 06 марта 2019

У меня есть таблица, которая выглядит следующим образом:

ID    YEAR    SOURCE    VALUE
 1    2014        AV       15
 1    2014        OV       25
 1    2015        AV       87
 2    2014        AX       44
 2    2015        AZ       32
 2    2015        NL        2
 3    2011        OV      104

Я хочу перестроить таблицу, чтобы получить новый столбец, в котором суммируются значения, предоставленные из источников AV, AX и NL, иеще один новый столбец, где приведены значения от OV.Например, приведенное выше будет выглядеть так:

ID    YEAR    AV+AX+NL    OV
 1    2014          15    25
 1    2015          87    NA
 2    2014          44    NA
 2    2015          32    NA
 3    2011          NA   104

Я хотел бы сделать это в R, но могу использовать SQL, если это проще.До сих пор я пытался объединить команды «суммировать» и «изменить» из tidyverse для создания моих новых столбцов, но я не могу найти способ суммировать только определенные значения SOURCE, а не все из них.

Любая помощь высоко ценится

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Один вариант: dcast из data.table

library(data.table)
dcast(setDT(df1), ID + YEAR ~ SOURCE %in% c("AV", "AX", "NL"),
                value.var = "VALUE", sum)
1 голос
/ 06 марта 2019

Довольно простой SQL Server Query. Все, что вам нужно сделать, это условно суммировать по критериям.

SELECT ID, [YEAR]
    , SUM(CASE WHEN SOURCE IN ('AV', 'AX', 'NL') THEN [VALUE] ELSE NULL END) [AV+AX+NL]
    , SUM(CASE WHEN SOURCE = 'OV' THEN [VALUE] ELSE NULL END) [OV]
FROM src
GROUP BY ID, [YEAR]
ORDER BY ID, [YEAR]

Результаты:

| ID | YEAR | AV+AX+NL | OV   |
+----+------+----------+------+
| 1  | 2014 | 15       | 25   |
| 1  | 2015 | 87       | NULL |
| 2  | 2014 | 44       | NULL |
| 2  | 2015 | 2        | NULL |
| 3  | 2011 | NULL     | 104  |

Первоначально я использовал 0 в качестве альтернативного значения, когда условие в случае не соответствует. Однако, если вы хотите, чтобы NULL отображался вместо 0, когда нет совпадений, вам нужно изменить альтернативное значение на NULL. Если в агрегатную функцию передаются только значения NULL, возвращается NULL.

Единственное предостережение в том, что использование NULL вместо 0 в SUM приведет к предупреждению: нулевое значение удаляется с помощью агрегата или другой операции SET. В остальном все нормально.

EDIT

Это пустое предупреждение беспокоило меня. Альтернативой, которая даст те же результаты, будет преобразование столбца SOURCE, чтобы значения «av», «ax», «nl» были преобразованы в «av + ax + nl», а затем с помощью pivot получить суммы с помощью исходные значения 'av + ax + nl'.

SELECT pvt.ID, pvt.[YEAR], pvt.[AV+AX+NL], pvt.OV
FROM (
    SELECT ID, [YEAR], [VALUE]
        , CASE WHEN SOURCE IN ('AV', 'AX', 'NL') THEN 'AV+AX+NL' ELSE SOURCE END SOURCE2
    FROM src
) src2
PIVOT (
    SUM([VALUE])
    FOR SOURCE2 IN ([AV+AX+NL], [OV])
) pvt
ORDER BY ID, [YEAR]
0 голосов
/ 06 марта 2019

Есть несколько способов сделать это на сервере Sql, это один

WITH C AS(
    SELECT ID
          ,YEAR
          ,SUM(VALUE) AS [AVAXNL]
    FROM TABLE_1
    WHERE SOURCE IN('AV','AX','NL')
    GROUP BY ID,YEAR

),D AS(
    SELECT ID
          ,YEAR
          ,SUM(VALUE) AS [OV]
        FROM TABLE_1
    WHERE SOURCE IN('AV','AX','NL')
    GROUP BY ID,YEAR
)
SELECT  ISNULL(C.ID,D.ID) AS ID
       ,ISNULL(C.YEAR,D.YEAR) AS YEAR
       ,C.AVAXNL
       ,D.OV
FROM C
FULL JOIN D ON (C.ID = D.ID AND C.YEAR = D.YEAR)

Также вы можете поворачивать таблицу и добавлять каждую строку.

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