2015-09-15 2 views
2

Что является самым простым способом подсчета вхождения элемента в вектор или кадр данных на каждом grouop?
Я не имею в виду просто подсчет общего числа (как задают другие вопросы о стеке), но давая разные числа каждому успешному событию.R подсчет вхождения элемента по группам

, например, для этого простого dataframe: (но я буду работать с dataframes с большим количеством столбцов)

mydata <- data.frame(A=c("A","A","A","B","B","A", "A")) 

я нашел это решение:

cbind(mydata,myorder=ave(rep(1,nrow(mydata)),mydata$A, FUN=cumsum)) 

и вот результат:

A myorder 
A  1 
A  2 
A  3 
B  1 
B  2 
A  4 
A  5 

Нет ли какой-либо одной команды для этого ?. Или использовать специализированный пакет?

Я хочу, чтобы он позже использовал функцию распространения tidyr().

Мой вопрос не то же самое, чем Is there an aggregate FUN option to count occurrences? , потому что я не хочу знать общее количество occurrencies в конце, но кумулятивных occurencies до каждого элемента.

ОК, моя проблема является немного более сложным

mydata <- data.frame(group=c("x","x","x","x","y","y", "y"), letter=c("A","A","A","B","B","A", "A")) 

Я знаю только, чтобы решить первый пример, который я написал выше. Но что происходит, когда я хочу его также второй переменной группировки? что-то вроде вхождения (письмо) по группе.

group letter "occurencies within group" 
x  A  1 
x  A  2 
x  A  3 
x  B  1 
y  B  1 
y  A  1 
y  A  2 

Я нашел способ с

пр (Rep (1, nrow (MYDATA)), список (MYDATA $ группы, MYDATA $ письмо), FUN = cumsum)
хотя это должно быть чем-то легче.

+2

этот вопрос задавали много раз ... пожалуйста, прежде чем –

+0

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

ответ

5

Использование data.table

library(data.table) 
setDT(mydata) 
mydata[, myorder := 1:.N, by = .(group, letter)] 

by аргумент делает таблица будет рассматриваться в рамках групп колонке под названием A. .N - это количество строк в этой группе (если аргумент by пуст, это будет число строк в таблице), поэтому для каждой подкатегории каждая строка индексируется от 1 до количества строк в этой подкатегории, Таблица.

mydata 
    group letter myorder 
1:  x  A  1 
2:  x  A  2 
3:  x  A  3 
4:  x  B  1 
5:  y  B  1 
6:  y  A  1 
7:  y  A  2 

или dplyr решение, которое в значительной степени то же самое

mydata %>% 
    group_by(group, letter) %>% 
    mutate(myorder = 1:n()) 
+0

Хорошо. Что делать, если я также хочу, чтобы она была «второй»? – skan

+0

@skan 'by = list (A, B)'. Общим ярлыком для записи 'list' в' data.table' является точечный синтаксис, то есть 'by =. (A, B)' где 'B' - вторая переменная. Извините, у меня нет «tidyr» soln. –

+1

Или 'mydata [, myorder: = 1: .N, by =. (Group, letter)]' в случае, указанном после редактирования. –

Смежные вопросы