Рассчитать процент возникновения значения во времени в R - PullRequest
0 голосов
/ 10 марта 2019

Я новичок в R, извините, если это то, что уже было задано и решено - пробовал искать все утро, но я не уверен, смог ли я правильно это произнести.

Я бы хотел рассчитать процент появления значения во времени. Например, у меня есть таблица с двумя столбцами, номером дня и входным значением.

Можно ли рассчитать, а затем изменить в процентах появления определенного значения по отношению к номеру дня и предыдущим вхождениям? т.е.

Day     Value     Percentage
1         1          1.00
2         1          1.00
3         2          ... 
4         1          ...

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

Возможно, есть лучший способ, чем использовать проценты здесь. Это то, что приходит мне в голову изначально.

Ответы [ 2 ]

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

Используя данные, предоставленные @markus, одна dplyr возможность может быть:

df %>%
 mutate(temp = seq_along(Day) - cumsum(Value != 1),
        Percentage = ifelse(Value != 1, NA, temp * 100/seq_along(Day))) %>%
 select(-temp)

   Day Value Percentage
1    1     1  100.00000
2    2     1  100.00000
3    3     1  100.00000
4    4     2         NA
5    5     1   80.00000
6    6     2         NA
7    7     2         NA
8    8     1   62.50000
9    9     1   66.66667
10  10     1   70.00000
1 голос
/ 10 марта 2019

Один вариант с использованием replace

dat$Percentage <- with(dat,
                       replace(cumsum(Value == 1) / seq_along(Value), Value != 1, NA))
dat
#   Day Value Percentage
#1    1     1  1.0000000
#2    2     1  1.0000000
#3    3     1  1.0000000
#4    4     2         NA
#5    5     1  0.8000000
#6    6     2         NA
#7    7     2         NA
#8    8     1  0.6250000
#9    9     1  0.6666667
#10  10     1  0.7000000

Если вы хотите этот расчет для всех различных значений в столбце Value, вы можете сделать

dat$Percentage2 <- with(dat,
                        ave(Value, Value, FUN = seq_along) / seq_len(dim(dat)[1]))

данные

set.seed(1)
dat <- data.frame(Day = 1:10,
                  Value = sample(1:2, 10, TRUE, prob = c(.7, .3)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...