2012-05-02 2 views
2

Я пишу код, где мне нужно проверить, равны ли все размеры групп для заданного ввода данных. Например, предположим, что я хотел бы знать, имеет ли «миль на галлон» набора данных (в пакете ggplot2):Как проверить, имеет ли данные одинаковое количество наблюдений на группу?

  • Равное количество автомобилей для каждого производителя
  • Равное количество автомобилей для каждого типа привода (4- колесо, передний, задний)
  • Равное число автомобилей для каждого типа двигателя (4-цилиндровый, 6-цилиндровый, 8-цилиндровых)

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

library(ggplot2) # contains the mpg dataset 
summary(mpg$drive) # shows the breakdown of cars by drive-type, 
        # which we can verify is unequal 

Но я чувствую, что мне не хватает простого способа проверить, являются ли групповые размеры равными. Есть ли какая-то одна мифическая функция, которую я могу назвать как are.groups.of.equal.size(x)? Или другая базовая функция (или их состав), которая вернет такую ​​информацию?

+0

'table'? 'Aggregate'? 'Ddply'? Soooooo много способов сделать это. – joran

+0

@joran - Я пытаюсь автоматизировать его, поэтому решение будет в основном возвращать логическое значение относительно того, равны ли размеры группы или нет. Как я могу использовать 'table',' aggregate' или 'ddply' для этого? – briandk

+0

table() возвращает вектор. Просто проверьте, равны ли все элементы этого вектора. sd() будет одним быстрым способом сделать это. –

ответ

2

Поскольку Йоран сказал, что мы могли бы изобретать 100 способов отсюда до Рождества, как это сделать. Я чувствую запах microbenchmark вызов:

are.groups.of.equal.size <- function(x) { 
    y <- rle(as.character(sort(x)))$lengths 
    all(y%in%mean(y)) 
} 


are.groups.of.equal.size(c(3, 3, 3)) 
are.groups.of.equal.size(mtcars$cyl) 
are.groups.of.equal.size(CO2$Plant) 
are.groups.of.equal.size(mtcars$carb) 
+0

Я думаю, что 'rle' был недостающим предметом, который я искал. Что такое проблема с микрообъектами? – briandk

+0

Просто посмотрите, кто может придумать самый быстрый способ справиться с этой проблемой, так как по крайней мере 10 я могу думать о моей голове. Sd sugegstion тоже был творческим, о котором я и не думал. –

4

Вот один из способов сделать это:

are.groups.of.equal.size <- function(x)length(unique(table(x))) == 1L 

are.groups.of.equal.size(mpg$manufacturer) 
# [1] FALSE 
are.groups.of.equal.size(mpg$drv) 
# [1] FALSE 
are.groups.of.equal.size(mpg$year) 
# [1] TRUE 

Обратите внимание, что в случае необходимости, table есть варианты, как обращаться NA с в ваших данных.

0

Использование сд подход:

are.groups.of.equal.size <- function(x) { 
    x2 <- tapply(x, x, length) 
    sd(x2)==0 | length(x2)==1 
} 

are.groups.of.equal.size(c(3, 3, 3)) 
are.groups.of.equal.size(mtcars$cyl) 
are.groups.of.equal.size(CO2$Plant) 
are.groups.of.equal.size(mtcars$carb) 
Смежные вопросы