我需要计算 R 中某个项目的多数票,但我不知道如何处理这个问题。
我有一个包含项目和分配类别的数据框。我需要的是最常分配的类别。我该怎么做呢?
数据框:
item   category
1      2
1      3
1      2
1      2
2      2
2      3
2      1
2      1
结果应该是:
item   majority_vote
1      2
2      1
我需要计算 R 中某个项目的多数票,但我不知道如何处理这个问题。
我有一个包含项目和分配类别的数据框。我需要的是最常分配的类别。我该怎么做呢?
数据框:
item   category
1      2
1      3
1      2
1      2
2      2
2      3
2      1
2      1
结果应该是:
item   majority_vote
1      2
2      1
你可以在这里使用两件事。首先,这是获取向量中最频繁项的方式:
> v = c(1,1,1,2,2)
> names(which.max(table(v)))
[1] "1"
这是一个字符值,但如果需要,我们可以轻松地在其上添加一个 as.numeric。
一旦我们知道如何做到这一点,我们就可以使用 data.table 包的分组功能对其最常见的类别进行逐项评估。这是上面示例的代码:
> dt = data.table(item=c(1,1,1,1,2,2,2,2), category=c(2,3,2,2,2,3,1,1))
> dt
   item category
1:    1        2
2:    1        3
3:    1        2
4:    1        2
5:    2        2
6:    2        3
7:    2        1
8:    2        1
> dt[,as.numeric(names(which.max(table(category)))),by=item]
   item V1
1:    1  2
2:    2  1
新的 V1 列包含每个项目最常见类别的数字版本。如果你想给它起一个合适的名字,语法有点难看:
> dt[,list(mostFreqCat=as.numeric(names(which.max(table(category))))),by=item]
   item mostFreqCat
1:    1           2
2:    2           1
一个班轮(使用plyr):
ddply(dt, .(item), function(x) which.max(tabulate(x$category)))
如果你有一个计算模式的函数,如 package prettyR,你可以使用aggregate:
require(prettyR)
aggregate(d$category, by=list(item=d$item), FUN=Mode)
#  item x
#1    1 2
#2    2 1
 tdat <- tapply(dat$category, dat$item, function(vec) sort(table(vec), 
                                                 decreasing=TRUE)[1] )
 data.frame(item=rownames(tdat), plurality_vote=tdat)
  item plurality_vote
1    1              3
2    2              2
需要一个更复杂的函数来区分多数(可能有联系)和真正的多数。