我需要计算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
答案 0 :(得分:6)
你可以在这里使用两件事。首先,这是你在向量中获得最频繁项目的方式:
> 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
答案 1 :(得分:3)
一个班轮(使用plyr
):
ddply(dt, .(item), function(x) which.max(tabulate(x$category)))
答案 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
需要更复杂的功能来区分多个(可能有关系)和真正的多数。
答案 3 :(得分:1)
如果你有计算模式的功能,就像在包prettyR
中一样,你可以使用aggregate
:
require(prettyR)
aggregate(d$category, by=list(item=d$item), FUN=Mode)
# item x
#1 1 2
#2 2 1