我有一个类似于:
的数据集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中有没有快速无痛的方式来做这件事?
答案 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