накопленная частота с учетом определенных условий в R - PullRequest
1 голос
/ 26 мая 2019

Я новичок в R, и я действительно не знаю, как подсчитать кумулятивное число вхождений строки, если это тот же идентификатор, но другая дата. Также, если первая дата появляется более одного раза, она не должна учитываться впервая попытка. Посмотрите на строки 2 и 3, поэтому столбец, который я пытаюсь построить, называется "count" и равен нулю.«count» представляет время появления идентификатора, но соответствует следующим двум правилам:

1. Если это первое появление идентификатора, оно присваивает ноль.Например, для Id 1, несмотря на наличие двух разных регистров для самой первой даты этого Id, «count» равно нулю.

2. Для следующего вхождения Id 1 (строка 3 в Id1) он имеетдругая дата, поэтому «count» равно 2. Потому что 01.01.08 Id1 появился дважды.

Это DT, и результат, который я ищу, находится в столбце "count":

enter image description here

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Мы можем использовать от dplyr до group_by id и возвращать 0 для первого date, в противном случае вернуть счетчик появления 1-го date

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(count = ifelse(date == date[1L], 0, sum(date == date[1L])))

#     id   date       count
#   <dbl> <fct>      <dbl>
#1     1 01/01/2018     0
#2     1 01/01/2018     0
#3     1 02/01/2018     2
#4     2 03/02/2018     0
#5     2 04/04/2018     1

Или используябаза R ave с аналогичной логикой

as.numeric(with(df, ave(date, id, FUN = function(x) 
           ifelse(x == x[1L], 0, sum(x == x[1L])))))
#[1] 0 0 2 0 1

данные

df <- data.frame(id = c(1, 1, 1, 2, 2), date = c("01/01/2018", "01/01/2018", 
     "02/01/2018", "03/02/2018", "04/04/2018"), stringsAsFactors = FALSE)
0 голосов
/ 26 мая 2019

Опция с data.table, где мы преобразуем «data.frame» в «data.table» (setDT(df)), сгруппированные по «id», создаем «count» как sum логического вектора(date == first(date)), затем измените первую строку 'count' для каждого 'id' на 0

library(data.table)
setDT(df)[,  count := sum(date == first(date)), id]
df[df[, .I[1], id]$V1, count := 0][]
#   id       date count
#1:  1 01/01/2018     0
#2:  1 01/01/2018     2
#3:  1 02/01/2018     2
#4:  2 03/02/2018     0
#5:  2 04/04/2018     1

data

df <- data.frame(id = c(1, 1, 1, 2, 2), date = c("01/01/2018", "01/01/2018", 
 "02/01/2018", "03/02/2018", "04/04/2018"), stringsAsFactors = FALSE)
...