2016-05-18 3 views
0

Пытался преобразовать таблицу данных, но не может найти способ сделать это.Pivot, группа или агрегировать данные кадр

У меня есть кадр данных, как:

id letter 
1 a 
2 b 
3 c 
4 c 
5 a 
6 c 

Я хотел бы превратить его в:

id letter frequency(id) 
1,5  a  2 
2  b  1 
3,4,6 c  3 

Я посмотрел на cast() и table() и aggregate(), но не понял.

мне не нужно его как один кадр данных, чтобы начать, так что если есть два различных способа получить:

id letter 
1,5  a 
2  b 
3,4,6 c 

&

letter frequency(id) 
a  2 
b  1 
c  3 

Это нормально. Я могу их комбинировать. Благодаря

ответ

3

Здесь это версия data.table,

setDT(df)[, .(id = paste(id, collapse = ',')), letter] 
# letter id 
#1:  a 1,5 
#2:  b  2 
#3:  c 3,4,6 

setDT(df)[, .(freq = .N), letter] 
# letter freq 
#1:  a 2 
#2:  b 1 
#3:  c 3 

или 2 в 1

setDT(df)[, .(id = paste(id, collapse = ','), freq = .N), letter] 
# letter id freq 
#1:  a 1,5 2 
#2:  b  2 1 
#3:  c 3,4,6 3 
+0

Если id не уникален, как мне группировать идентификаторы? –

+0

Вам нужны только уникальные идентификаторы? – Sotos

+0

Да, я попробовал поместить уникальную() внешнюю пасту, и она не работала, пробовала внутри пасту вокруг id и R разбилась. –

3

Один подход к такого рода проблемы заключается в использовании dplyr следующим образом:

library(dplyr) 
df <- read.table(text = 'id letter 
1 a 
2 b 
3 c 
4 c 
5 a 
6 c', header = TRUE, stringsAsFactors = FALSE) 
df 
df %>% group_by(letter) %>% summarise(freq = n(), idlist = paste(id, collapse = ',')) 

Выход следующим образом (хотя вы можете переставить столбцы, если вы хотите):

Source: local data frame [3 x 3] 

    letter freq idlist 
    <chr> <int> <chr> 
1  a  2 1,5 
2  b  1  2 
3  c  3 3,4,6 
+0

Это: 'install.packages («dplyr»)' – Gopala

+0

Вы можете получить версию Dev из GitHub, хотя, так что есть несколько исправлений ошибок. Есть много сообщений об установке пакетов, а также множество руководств по этим типам пакетов. – Gopala

+0

Если id не уникален, как мне группировать идентификаторы? –