ggplot: барплот y значение как сгруппированное значение столбца - PullRequest
0 голосов
/ 24 января 2020

У меня есть набор данных, в котором я хочу создать столбчатую диаграмму путем группировки столбцов, но я хочу, чтобы счетчик каждой группы отражал уникальное значение столбца для этой группы.

DT <- data.table(id=c(1,1,1,1,2,2,2,3,3,3,4,4,4,5,5),
                 time=c(0,1,2,3,0,1,2,0,1,2,0,1,2,0,1),
                 exposure=c(1,2,0,3,2,3,1,0,3,3,0,0,3,3,0),
                 tmin=c(rep(2,15)),
                 rule=c(rep("a",7),rep("b",6),rep("c",2)))
tmin <- 2

DT[time<=tmin,exposure.sum:=sum(exposure),by=rule]

Я хочу сгруппировать столбец rule и содержит число для правила a, b, c, равное 9,9,3, соответственно. Как видно из столбца exposure.sum

> DT[time<=tmin,]
    id time exposure tmin rule exposure.sum
 1:  1    0        1    2    a            9
 2:  1    1        2    2    a            9
 3:  1    2        0    2    a            9
 4:  2    0        2    2    a            9
 5:  2    1        3    2    a            9
 6:  2    2        1    2    a            9
 7:  3    0        0    2    b            9
 8:  3    1        3    2    b            9
 9:  3    2        3    2    b            9
10:  4    0        0    2    b            9
11:  4    1        0    2    b            9
12:  4    2        3    2    b            9
13:  5    0        3    2    c            3
14:  5    1        0    2    c            3

Теперь, я создал простой график, но подсчет для каждого правила оказывается полной суммой exposure.sum для каждого соответствующего правила; В итоге я получаю барплот со счетом 54,54,6, когда на самом деле хочу, чтобы они были 9,9,3 (т.е. уникальное значение exposure.sum для этого правила)

ggplot(DT[time<=tmin,]) +
  geom_bar(aes(x=rule,y=exposure.sum),stat="identity")

1 Ответ

2 голосов
/ 24 января 2020

Это решение с использованием dplyr.

library(tidyverse)

DT <- data.table(id=c(1,1,1,1,2,2,2,3,3,3,4,4,4,5,5),
                 time=c(0,1,2,3,0,1,2,0,1,2,0,1,2,0,1),
                 exposure=c(1,2,0,3,2,3,1,0,3,3,0,0,3,3,0),
                 tmin=c(rep(2,15)),
                 rule=c(rep("a",7),rep("b",6),rep("c",2)))
tmin <- 2

DT[time<=tmin,exposure.sum:=sum(exposure),by=rule]

DT[time <= tmin] %>% group_by(rule) %>% summarise(exposure.sum = sum(exposure)) %>% 
            ggplot(aes(x = rule, y = exposure.sum)) + geom_bar(stat = 'identity') + 
            scale_y_continuous(breaks = (1:9)) + geom_text(aes(label = exposure.sum, y = exposure.sum - 0.6), size = 10, color = 'white')

, которое выдает следующий вывод:

...