【问题标题】:How do I determine count of unique levels by categories如何按类别确定唯一级别的计数
【发布时间】:2014-05-28 20:55:33
【问题描述】:

我正在分析一组包含多个重复 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

【问题讨论】:

  • 您想要一个简单的频率表?尝试:表(年)
  • 你应该使用data.frame(.)直接创建一个data.frame。不要使用cbind,然后将其转换为data.frame。因为cbind 将其转换为一个矩阵,其中所有列 have 为同一类型!
  • 谢谢,阿伦。感谢您的建议。

标签: r aggregate unique


【解决方案1】:

尝试使用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

【讨论】:

  • 谢谢吉尔伯。我现在知道在使用聚合()时我在哪里犯了错误。我使用了 FUN = length(unique()。谢谢。
【解决方案2】:

使用具有两个维度的表,然后对逻辑 &gt; 0 操作的结果使用 rowSums:

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

只需添加这个,您就可以看到中间结构:

>  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

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多