通常人们想计算每个问题的众数,但在我的例子中,我需要计算所有问题的每个受访者的众数。
这是我的数据的样子:
> head(TiposMotivA)
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20 Q21
1 5 4 4 4 6 6 7 6 4 6 6 6 4 4 4 4 6 7 4 4 6
2 5 4 4 5 5 5 5 5 5 5 7 5 4 3 1 6 6 5 6 7 7
3 4 5 4 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5
4 5 5 7 7 4 6 6 6 7 7 6 7 7 6 6 7 4 7 6 6 7
5 6 1 7 6 7 7 7 7 7 7 6 7 2 2 3 6 3 7 7 7 7
6 4 4 3 3 4 5 4 3 4 7 6 6 4 4 6 4 5 7 6 6 7
这个解决方案是我迄今为止找到的最好的解决方案:
apply(TiposMotivA, 1, Compose(table,
function(i) i==max(i),
which,
names,
function(i) paste0(i, collapse='/')
)
)
它由 Matthew Lundberg 提供:Select majority number of each row in matrix using r
它产生了这个:
[1] "4" "5" "4" "7" "7" "4" "7" "6" "7" "7" "7" "7" "7"
[14] "5/6" "7" "6" "7" "6" "7" "7" "7" "7" "7" "7" "7" "7"
[27] "7" "7" "7" "5" "2" "7" "7" "7" "7" "7" "6" "6" "7"
[40] "4/7" "3" "4" "7" "5/7" "6" "7" "7" "6" "7" "6" "7" "7"
[53] "7" "6" "7" "7" "5/7" "7" "7" "7" "7" "7"
>
我的问题对某些人来说似乎很基本,但让我抓狂。 我每行只需要一个模式,所以当有两个模式时,我只需要第一个。 我曾尝试使用 split() 但没有成功。
所以,我需要的是获取每一行的模式,如上所述,但是当有两行时只有第一种模式。
像这样:
[1] "4" "5" "4" "7" "7" "4" "7" "6" "7" "7" "7" "7" "7"
[14] "5" "7" "6" "7" "6" "7" "7" "7" "7" "7" "7" "7" "7"
[27] "7" "7" "7" "5" "2" "7" "7" "7" "7" "7" "6" "6" "7"
[40] "4" "3" "4" "7" "5" "6" "7" "7" "6" "7" "6" "7" "7"
[53] "7" "6" "7" "7" "5" "7" "7" "7" "7" "7"
>
我们将不胜感激任何帮助。
最佳答案
which.max
可用于查找第一个最大值的位置:
apply(TiposMotivA, 1, function(x) { tab <- table(x); names(tab)[which.max(tab)] } )
给予:
1 2 3 4 5 6
"4" "5" "4" "7" "7" "4"
不需要包。
关于R计算一行而不是列的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28200108/