在R中的数据帧中找到最大量的重复值

时间:2015-04-13 15:08:33

标签: r loops for-loop

在这里开始R程序员。

我有一个名为'narc'的数据框,记录了40个测量自恋的不同问题的答案。

看起来像这样:

 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16
1723  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
7231  2  2  2  1  1  2  1  1  2   2   2   2   2   2   1   2
5556  2  2  2  1  2  2  2  1  1   2   2   1   2   2   1   1
1511  2  2  2  2  2  2  2  2  2   2   2   2   2   2   2   2
2080  1  1  2  2  1  1  2  2  2   1   1   2   1   2   1   1
1074  2  2  1  1  2  2  2  1  1   1   1   1   2   2   1   2
     Q17 Q18 Q19 Q20 Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30
1723   0   0   0   0   0   0   0   0   0   0   0   0   0   0
7231   1   2   2   1   2   1   1   2   2   1   1   1   2   2
5556   1   1   1   1   1   2   1   2   2   1   2   1   2   1
1511   2   2   2   2   2   2   2   2   2   2   2   2   2   2
2080   1   1   1   1   2   1   2   1   1   1   2   1   1   1
1074   2   1   1   1   1   1   2   2   2   1   1   1   2   2
     Q31 Q32 Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40 elapse gender age
1723   0   0   0   0   0   0   0   0   0   0      8      1  23
7231   2   1   1   1   1   2   2   2   2   1     24      1  21
5556   2   1   1   2   1   1   2   2   2   1     33      2  18
1511   2   2   2   2   2   2   2   2   2   2     51      1  16
2080   2   2   1   1   2   1   1   2   2   2     59      1  20
1074   1   1   1   1   1   2   2   1   2   1     60      1  24
     score      level
1723     0        not
7231     8        not
5556    11        not
1511    17     mildly
2080    21 moderately
1074    14        not

我还有一个名为'narc.key'的数据框,其答案与自恋相对应,它看起来像这样:

  Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17
1  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1   2
  Q18 Q19 Q20 Q21 Q22 Q23 Q24 Q25 Q26 Q27 Q28 Q29 Q30 Q31 Q32
1   2   2   2   1   2   2   1   1   2   1   2   1   1   1   2
  Q33 Q34 Q35 Q36 Q37 Q38 Q39 Q40
1   1   1   2   1   1   1   1   2

我想找出哪个问题的自恋答案最多。

我解决这个问题的方法是创建一个值向量来记录每列匹配narc.key的行数。但是,我在如何做到这一点上遇到了一些麻烦。到目前为止,这是我的代码:

  for (i in 1:nrow(narc)){

  }
    for(x in 1:40){
      highest.score<-narc[i]
      for(y in 1:40)
        if(narc[i,y]==narc.key[1,y]){

我很难绕着下一步做什么。 请帮帮忙?

2 个答案:

答案 0 :(得分:2)

这并不奇怪,但您可以创建与问题大小相同的答案数据集,并使用==(假设您的数据集不是很大,这应该不会太慢)

qs <- read.table(header = TRUE, text="Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16
  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  2  2  2  1  1  2  1  1  2   2   2   2   2   2   1   2
  2  2  2  1  2  2  2  1  1   2   2   1   2   2   1   1
  2  2  2  2  2  2  2  2  2   2   2   2   2   2   2   2
  1  1  2  2  1  1  2  2  2   1   1   2   1   2   1   1
  2  2  1  1  2  2  2  1  1   1   1   1   2   2   1   2")

ans <- read.table(header = TRUE, text="  Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16
1  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1")


ans[1:nrow(qs), ] <- ans[1, ]

#   Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16
# 1  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1
# 2  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1
# 3  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1
# 4  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1
# 5  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1
# 6  1  1  1  2  2  1  2  1  2   2   1   1   1   1   2   1

然后对列进行总结:

colSums(qs == ans)

# Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8  Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 
# 1   1   1   2   3   1   4   3   3   3   2   2   1   0   1   2 

答案 1 :(得分:0)

编辑:我误解了需求。这个答案表明哪些问题作为最常见的答案,是一个答案。不是哪个问题的答案数量最多。

这是一种方式。该库是如此,我可以使用管道,使其更容易遵循。我有一个40列,10行的矩阵 - 所有随机选择为0,1或2.我使用apply函数,跨列,并列表响应。然后,我应用于列表的每个元素(每列有40个,每个一个)函数which.max,它将返回表中最高值的索引。然后,我应用于每个列表元素(同样,40)并询问names返回的值的which.max,这将给出具有最高计数的响应。最后,我unlist并将它们转换为整数(否则它们是文本)。这可以与narc键进行比较,以查看哪些答案匹配。

library(magrittr)
mat = matrix(sample(c(0,1,2),400,replace=T),ncol=40)
output = mat %>%
  apply(2,table) %>%
  lapply(which.max) %>%
  lapply(names) %>%
  unlist() %>%
  as.integer()
narc.key == output

这种意想不到的结果是,如果最常见的是并列,你可能会得到第一个答案,而不是两者。