#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