2015-04-02 5 views
2

Я пытаюсь найти, как подсчитать количество целых чисел каждого типа в векторе. Например, сколько 1, 2 и 3 есть (без жесткого кодирования == 1,2,3):R эквивалент SQL SELECT COUNT (*) ... GROUP BY

test_vec = c(1,2,3,1,2,1,2,1,1,1,2,1,3,1,2,3,2,1,2,1,3) 

И, как определить, что я добавил некоторые 4с к вектору и сосчитать их?

test_vec = c(test_vec,4,4,4) 

Я мог бы сделать это с range() и петлей, но задавался вопросом, есть ли вообще vectorised решение?

Edit: не тот же вопрос, как this, потому что вопрос не спрашивает об обобщенной table ситуации (хотя ответы разумно предположить, что он), а проверка жестко равенство sum(test_vec==x)

+0

'таблица (test_vec)' является один подход. – nrussell

+1

Если вы посмотрите на данные через SQL-очки, 'data.table' может быть вам полезен не только для этой цели (как описано в Colonel Beauvel) https://rawgit.com/wiki/Rdatatable/data.table/ vignettes/datatable-intro-vignette.html – rmuc8

+0

Возможный дубликат [Подсчет количества элементов со значениями x в векторе?] (http://stackoverflow.com/questions/1923273/counting-the-number-of-of- element-with-the-values-of-x-in-a-vector) – rmuc8

ответ

3

aggregate очень удобно в этой ситуации

> aggregate(data.frame(count = test_vec), list(value = test_vec), length) 

    value count 
1  1 10 
2  2  7 
3  3  4 
+0

Это будет очень полезно для меня, так как больший контекст этой маленькой проблемы связан с большим количеством data.frames, извлеченных из базы данных. Благодарю. – Escher

+0

Я закончил тем, что принял это (хотя таблица является очевидным простейшим ответом), потому что я предполагаю, что большинство людей, работающих с базами данных, будут иметь data.frames, и это помогло мне больше всего. – Escher

+0

Я думаю, что этот андер довольно запутанный, поскольку вы работаете с вектором в вашем примере. Почему бы вам сделать это настолько сложным и преобразовать вектор в data.frame? Я, конечно, не эксперт, но почему бы вам не написать 'aggregate (test_vec, length, by = list (test_vec))' – rmuc8

4

вы можете использовать таблицу

table(test_vec) 
test_vec 
1 2 3 
10 7 4 
1

ко второй части вашего вопроса

> which(test_vec == 4) 

[1] 22 23 24 # gives you their position in the vector in order to "identify" them 

> sum(test_vec == 4) 

[1] 3 # counts the 4's in the vector 

редактировать: как мы уже все здесь,

tapply(test_vec, test_vec, length) 

также будет работать

1 2 3 
10 7 4 
2

Вы можете использовать data.table пакет, а также для подсчета количества элементов в каждой группе.

library(data.table) 
as.data.table(x = test_vec)[, .N, by=x] 
# x N 
#1: 1 10 
#2: 2 7 
#3: 3 4 
#4: 4 3 

.N является специальным встроенным переменной и является длиной 1-целое число. Он содержит количество наблюдений в каждой группе.

2

dplyr подход:

test_vec = c(1,2,3,1,2,1,2,1,1,1,2,1,3,1,2,3,2,1,2,1,3) 
library(dplyr) 
df <- data_frame(test_vec) 

df %>% 
    count(test_vec) 

# Alternative that shows group_by 
df %>% 
    group_by(test_vec) %>% 
    summarise(n = n()) # or tally() 

# test_vec n 
# 1  1 10 
# 2  2 7 
# 3  3 4 
+1

Я сделал редактирование; не стесняйтесь откатываться, если вам не нравится использование 'count', но это меньше печатает. –

+1

@TylerRinker достаточно правдоподобный - отредактирован, чтобы показать оба только потому, что вопрос задавал конкретно эквиваленты предложения SQL Group. – JasonAizkalns