如何按类别确定唯一级别的计数

时间:2014-05-28 20:55:34

标签: r aggregate unique

我正在分析一组包含多个重复ID和年份的数据。我试图按年计算唯一ID。我可以使用unique()计算所有年份的唯一ID。我尝试使用table()和aggregate()与unique()和length(),但得到" unique()仅适用于向量"错误。我写了一个" for"循环有效,但必须有一个更简单的方法来做到这一点。

以下是" for"的示例代码循环:

years <- as.factor( c( rep("2001",3), rep("2002", 5), rep( "2003", 4)))
id <- as.factor( rep(1:6,2))
mydata <- data.frame( years, id )
attach( mydata )

levels.year <- levels( years)
id.by.year <- data.frame( Year = 1:3, Counts = rep(NA, 3) )
for ( i in 1:3 ){
  id.by.year[i,1] <- levels.year[i]
  mydata.by.year <- mydata[ years == levels.year[i],]
  id.by.year[i,2] <- length( unique( mydata.by.year$id))
}
id.by.year

输出如下:

  Year Counts
1 2001      3
2 2002      5
3 2003      4

2 个答案:

答案 0 :(得分:2)

尝试使用aggregate

years <- as.factor( c( rep("2001",3), rep("2002", 5), rep( "2003", 4)))
id <- as.factor( rep(1:6,2))
mydata <- data.frame( id, years ) # do not use `cbind`

aggregate(id~years, FUN=length, data=mydata)
##  years id
##1  2001  3
##2  2002  5
##3  2003  4

答案 1 :(得分:2)

对两个维使用表,然后对逻辑> 0操作的结果使用rowSums:

rowSums( with(mydata, table( years, id) ) > 0  )
2001 2002 2003 
   3    5    4 

Jus添加这个以便你可以看到中间结构:

>  with(mydata, table( years, id) )
      id
years  1 2 3 4 5 6
  2001 1 1 1 0 0 0
  2002 1 1 0 1 1 1
  2003 0 0 1 1 1 1