Последовательно подсчитайте возникновение кадра данных условия R

#r #dataframe #count

Вопрос:

У меня есть фрейм данных, который выглядит так

 Sample_No Lab_ID
1234       2
1235       2
1236       2
2344       3
3425       4
2341       5
6756       5
...
 

Я хочу подсчитать, сколько раз встречается каждый lab_id, но число событий рядом с ним в новом столбце фрейма данных будет выглядеть примерно так

 Sample_No Lab_ID   Occurrence
1234       2           1
1235       2           2
1236       2           3
2344       3           1 
3425       4           1
2341       5           1 
6756       5           2
...
 

Я могу получить список уникальных значений, используя

Я мог бы сделать что-то вроде

 table(df$LAB_ID)
 

но это приводит к таблице, суммирующей количество

любая помощь будет признательна

Ответ №1:

Вот решение без загрузки более десятка дополнительных пакетов с использованием rle .

 > x <- c(2,2,2, 3, 4, 5,5)
> 
> cs <- rle(x)
> 
> xy <- cs$lengths
> 
> out <- mapply(
    FUN = function(x) seq(from = 1, to = x, by = 1),
    xy
  )
> 
> data.frame(
    lab_id = x,
    occurrence = unlist(out)
  )
  lab_id occurrence
1      2          1
2      2          2
3      2          3
4      3          1
5      4          1
6      5          1
7      5          2
 

Ответ №2:

Если вы хотите подсчитать количество случаев каждого Lab_ID из них, вы можете либо использовать {dplyr} пакет:

 library(dplyr)

df%>% 
  count(Lab_ID, name = "Occurrence")
 

Или вы могли бы добиться того же самого, используя {data.table} пакет следующим образом:

 library(data.table)

setDT(df)[, .(Occurrence = .N),
              by = Lab_ID]
 

Ответ №3:

Если вы хотите использовать tidyverse , или в этом случае dplyr :

 library(tidyverse) # load library

df <- df %>%
  group_by(Lab_id) %>% # for every lab ID
  summarise(Occurence=n()) # count occurence
 

Ответ №4:

Базовый вариант R с использованием sequence rle

 transform(
  df,
  Occurence = sequence(rle(Lab_ID)$lengths)
)
 

дает

   Sample_No Lab_ID Occurence
1      1234      2         1
2      1235      2         2
3      1236      2         3
4      2344      3         1
5      3425      4         1
6      2341      5         1
7      6756      5         2
 

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

 > setDT(df)[, Occurence := rleid(Sample_No), Lab_ID][]
   Sample_No Lab_ID Occurence
1:      1234      2         1
2:      1235      2         2
3:      1236      2         3
4:      2344      3         1
5:      3425      4         1
6:      2341      5         1
7:      6756      5         2