2014-02-03 4 views
0

У меня есть фрейм данных. Я хотел бы создать частотную таблицу, которая показывает частоту бункера «Группой». Если есть bin с 0 сущностями, я хочу, чтобы он показал, что в этом буфере есть 0 объектов.Частота подсчета для всех возможных ячеек

Если я использую функцию table(), я получаю частоту всех ящиков в моем кадре данных, но не «Группой». Он также не говорит мне, что, например, у меня нет строк в Group 1 Bin 3. Я также изучил tabulate(), но это не похоже на то, что мне нужно. Как-то мне нужно сказать, что такое набор возможных бункеров.

Вот пример кода.

df = as.data.frame(rbind(c(1,1.2), c(1,1.4), c(1,2.1), c(1,2.5), c(1,2.7), c(1,4.1), c(2,1.6), c(2,4.5), c(2,4.3), c(2,4.8), c(2,4.9))) 
    colnames(df) = c("Group", "Value") 
    df.in = split(df, df$Group) 

    FindBin = function(df){ 
     maxbin = max(ceiling(df$Value),na.rm=TRUE)+1 #what is the maximum bin value. 
     bin = seq(from=0, to=maxbin, by=1) #Specify your bins: 0 to the maximum value by increments of 1 
     df$bin_index = findInterval(df$Value, bin, all.inside = TRUE) #Determine which bin the value is in 
     return(df) 
    } 

    df.out = lapply(names(df.in), function(x) FindBin(df.in[[x]])) 
    df.out2 = do.call(rbind.data.frame, df.out) #Row bind the list of dataframes to one dataframe 

Выход df.out2 выглядит следующим образом:

 Group Value bin_index 
    1  1 1.2   2 
    2  1 1.4   2 
    3  1 2.1   3 
    4  1 2.5   3 
    5  1 2.7   3 
    6  1 4.1   5 
    7  2 1.6   2 
    8  2 4.5   5 
    9  2 4.3   5 
    10  2 4.8   5 
    11  2 4.9   5 

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

Group  Bin  Freq 
    1   1  0 
    1   2  2 
    1   3  3 
    1   4  0 
    1   5  1 
    2   1  0 
    2   2  1 
    2   3  0 
    2   4  0 
    2   5  4 

Любые идеи?

+0

Unrelated, почему бы вам не просто использовать 'ф.р. $ bin_index <- потолка (ДФ $ Value)'? – BrodieG

ответ

2

Не table делать то, что вы хотите для вашего первого вопроса:

df$bin_index <- factor(df$bin_index, levels=1:5) 
table(df[, c("Group", "bin_index")]) 
#  bin_index 
# Group 1 2 3 4 5 
#  1 0 2 3 0 1 
#  2 0 1 0 0 4 

Это показывает 0 записи для бункера 3, 2-й группы (я предполагаю, что это то, что вы имели в виду, есть строки для бункера 3 в группа 1). Кроме того, установив уровни факторов, я смог также получить bin_index 1. Для вашего второго вопроса, то просто использовать melt:

library(reshape2) 
melt(table(df[, c("Group", "bin_index")])) 
# Group bin_index value 
# 1  1   1  0 
# 2  2   1  0 
# 3  1   2  2 
# 4  2   2  1 
# 5  1   3  3 
# 6  2   3  0 
# 7  1   4  0 
# 8  2   4  0 
# 9  1   5  1 
# 10  2   5  4  
+0

Спасибо, это делает то, что мне нужно для этого, по большей части, и получает меня намного дальше, чем раньше. Использование фактора, а затем таблица - хорошая идея. Все мои группы имеют разные значения bin_indexes. Например, в группе 1 могут быть корзины, которые достигают 130, в то время как у группы 2 есть ячейки, которые достигают 105 и т. Д. Возможно, я смогу удалить строки по номеру группы, где bin_index больше, чем самый большой bin_index для этой группы. Благодаря! – SC2

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