2015-06-19 7 views
2

Пусть у меня есть кадр данных, как:эффективно найти количество значений столбцов для отдельных строк в dataframe в г

id value 
1 "hi" 
1 "hi" 
1 "hi again" 
1 "hi again" 
2 "hello" 
2 "hi" 

Теперь я хочу, чтобы получить количество каждого значения для каждого из отчетливых значения в столбце id. Выход будет, как

id value  Freq 
1  "hi"  2 
1  "hi again" 2 
2  "hello"  1 
2  "hi"  1 

Я пытался раскалывается первым кадром данных для каждого отдельного ID и получить частоту, используя таблицу() функции на значение колонки и добавляя идентификатора колонке позже. Кроме того, у меня в памяти много кадров данных. Я просто хочу знать, могу ли я достичь вышеупомянутого блока данных, не пережевывая свою память с большим количеством данных (поскольку у меня почти 5 миллионов строк).

+0

'as.data.frame (таблица (DF))' Используйте 'table' в обоих столбцах. В качестве альтернативы используйте 'data.table' (который окажется более эффективным), как показано ниже. – Frank

ответ

4

предполагается, что ваш data.frame называется DF, используя data.table:

library(data.table) 
setDT(df)[ , .(Freq = .N), by = .(id, value)] 

использованием dplyr:

libary(dplyr) 
group_by(df, id, value) %>% summarise(Freq = n()) 

Вы должны выбрать одну из этих двух пакетов (dplyr или data.table) и учиться этому действительно основательно. В конечном итоге вы, вероятно, будете использовать и то, и другое. Но начиная с одного и действительно понимая, это очень поможет вам. Я использую оба в значительной степени каждый раз, когда я использую R.

dplyr, как правило, легче для новичков, поэтому я бы прочитал на нем tutorial. Это поможет вам навсегда. Существует также отличный видео-учебник, который можно найти на странице this site под грамматикой и графикой datascience.

Я лично предпочитаю data.table, потому что он быстрее и гибче. Проверьте новые виньетки HTML и виньетки PDF here.

+0

Благодарим @grrgrrbla за отличное объяснение и ресурсы. Я пробовал использовать dplyr и почему-то не достиг нужного результата. – Shiva

+0

рад, что это помогло, пожалуйста, примите ответ, если это поможет, щелкнув стрелку и повысьте ее. – grrgrrbla

+0

Кстати, эти два подхода работают с одинаковой скоростью, если вы используете синтаксис dplyr на таблице данных. (Я просто попробовал это на своем компьютере.) 'DT <- data.table (id = 1: 1e6) [,. (Value = sample (letters, sample (5,1))), by = id]; DF <- setDF (копия (DT)); system.time (group_by (DT, id, value)%>% mutate (Freq = n())); system.time (DT [,. (Freq = .N), by =. (id, value)]) 'Работа с data.frame в 5 раз медленнее, хотя:' system.time (group_by (DF, id, value)%>% mutate (Freq = n())) – Frank