R:通过选择某些行来生成频率表

时间:2016-05-26 15:06:48

标签: r

我有一个类似于:

的数据集D的最小示例
 score person freq
    10      1    3
    10      2    5
    10      3    4
     8      1    3
     7      2    2
     6      4    1

现在,我希望能够针对人物绘制得分= 10的频率。

但是,如果我这样做:

#My bad, turns out the next line only works for matrices anyway:
#D = D[which(D[,1] == 10)]

D = subset(D, score == 10)

然后我得到:

score person freq
   10      1    3
   10      2    5
   10      3    4

然而,这就是我 希望得到的:

score person freq
   10      1    3
   10      2    5
   10      3    4
   10      4    0

在R中有没有快速无痛的方式来做这件事?

3 个答案:

答案 0 :(得分:6)

这是一个基础R方法:

subset(as.data.frame(xtabs(freq ~ score + person, df)), score == 10)
#   score person Freq
#4     10      1    3
#8     10      2    5
#12    10      3    4
#16    10      4    0

答案 1 :(得分:4)

您可以使用complete()包中的tidyr创建缺失的行,然后您可以简单地进行分组:

library(tidyr)
D2 <- complete(D, score, person, fill = list(freq = 0))
D2[D2$score == 10, ]
## Source: local data frame [4 x 3]
## 
##   score person  freq
##   (int)  (int) (dbl)
## 1    10      1     3
## 2    10      2     5
## 3    10      3     4
## 4    10      4     0

complete()将它应该使用的数据框作为第一个参数。然后按照应该完成的列的名称进行操作。参数fill是一个列表,它为每个剩余的列(这里只有freq)提供它们应该填充的值。

根据docendo-discimus的建议,可以通过使用dplyr包进一步简化,如下所示:

library(tidyr)
library(dplyr)
complete(D, score, person, fill = list(freq = 0)) %>% filter(score == 10)

答案 2 :(得分:0)

以下是dplyr方法:

D %>%   mutate(freq = ifelse(score == 10, freq, 0),
               score = 10) %>%
        group_by(score, person) %>%
        summarise(freq = max(freq))

Source: local data frame [4 x 3]
Groups: score [?]

  score person  freq
  (dbl)  (int) (dbl)
1    10      1     3
2    10      2     5
3    10      3     4
4    10      4     0