2

我正在编写一些代码,我需要检查给定数据输入的所有组大小是否相等。例如,假设我想知道“mpg”数据集(在 ggplot2 包中)是否具有:

  • 每个制造商的汽车数量相同
  • 每种驱动类型(四轮、前轮、后轮)的汽车数量相等
  • 每种发动机类型的汽车数量相同(4 缸、6 缸、8 缸)

对于像 mpg 这样的数据,其中一些问题可以通过检查摘要输出来回答

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)吗?还是会返回此类信息的另一个基本功能(或它们的组合)?

4

3 回答 3

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数据中的 s。

于 2012-05-03T00:06:46.780 回答
2

正如 Joran 所说,我们可以从这里到圣诞节发明 100 多种方法来解决这个问题。我闻到了微基准挑战:

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)
于 2012-05-03T00:12:44.393 回答
0

使用 sd 方法:

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)
于 2012-05-04T19:29:32.603 回答