2015-05-29 2 views
1

У меня есть набор данных следующим образом:Как рассчитать частоту каждого значения в столбце, соответствующем каждому значению в другом столбце в R?

col1 col2 
    A 1 
    A 2 
    A 2 
    B 1 
    B 1 
    C 1 
    C 1 
    C 2 

Я хочу вывод как:

col1 col2 Frequency 
    A  1  1 
    A  2  2 
    B  1  2 
    C  1  2 
    C  2  1 

Я попытался с помощью агрегатной функции, а также функции таблицы, но я не могу получить желаемый результат.

+0

Не хотелось бы создать какую-то публикацию в сообществе wiki для этого вопроса, так как она возникает так часто? – rmuc8

ответ

5

Вы можете добавить фиктивный столбец или использовать rownames агрегировать на:

aggregate(rownames(mydf) ~ ., mydf, length) 
# col1 col2 rownames(mydf) 
# 1 A 1    1 
# 2 B 1    2 
# 3 C 1    2 
# 4 A 2    2 
# 5 C 2    1 

table также отлично работает, но сообщит о комбинации, которые не могут быть в ваших данных, как «0»:

data.frame(table(mydf)) 
# col1 col2 Freq 
# 1 A 1 1 
# 2 B 1 2 
# 3 C 1 2 
# 4 A 2 2 
# 5 B 2 0 
# 6 C 2 1 

Другой хороший подход заключается в использовании "data.table":

library(data.table) 
as.data.table(mydf)[, .N, by = names(mydf)] 
+0

удалил мой ответ, который также использует data.table, если вы все это собрано в одном сообщении :), я бы использовал setDT вместо as.data.table и правильно назвал столбец: 'setDT (df) [,. (« Частота "= .N), by =. (Col1, col2)]' – grrgrrbla

+0

@grrgrrbla, Спасибо за комментарий, но (1) я предпочитаю не изменять данные другого человека, используя 'setDT', если я не знаю *, что * они знать, что это делает, и (2) переименование столбцов - довольно стандартная задача и, на мой взгляд, не имеет решающего значения для заданного здесь вопроса. – A5C1D2H2I1M1N2O1R2T1

+0

(Это вопрос личного предпочтения, я знаю.) – A5C1D2H2I1M1N2O1R2T1

2

если ваши данные

col1 <- c("A","A","A","B","B","C","C","C") 
col2 <- c(1,2,2,1,1,1,1,2) 
df <- data.frame(col1,col2) 

вы можете использовать dplyr

1) group_by как обе переменные, так как ваш выход должен включать в себя все возможные комбинации из них

2) сосчитать число наблюдений для каждой группы с использованием n()

library(dplyr) 
df %>% group_by(col1,col2) %>% summarize(frequency=n()) 


# output 
    col1 col2 frequency 
1 A 1   1 
2 A 2   2 
3 B 1   2 
4 C 1   2 
5 C 2   1 
+2

Это может быть сокращено до: 'df%>% count (col1, col2)' –

+0

thx для вашего комментарий – rmuc8

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