我正在为一个项目处理图形,并希望在图形底部添加观察值。我用代码完成了
table(dat$year)
返回
2014 2015 2016 2017 2018 2019
41 83 34 56 43 22
但是,我意识到对于我的一列,我有相当数量的NA条目,因此,不仅要查找那一年中观察值的数量,还需要找到该列中按年份细分的观察值,并排除NA结果。基本上我需要的是Excel的“计数”功能按年份细分。
Internet搜索仅使我找到如何在该列中获得每次观察的频率(我意识到这就是table()
函数的作用),尽管在我意识到自己的错误之前还可以,但是显然现在不会工作。
使用一些小的示例数据,
dat
year a b c
2014 1 1 NA
2014 1 2 NA
2014 2 2 3
2015 NA 3 3
2015 1 2 NA
2015 1 1 1
2016 2 1 1
2016 1 3 1
2016 1 2 NA
此问题与此处[为R中的多个因子列创建频率表](Create frequency tables for multiple factor columns in R)和此处Counting frequencies of each letter for multiple column描述的问题相反。鉴于这两个帖子将生成如下表:
1 2 3
2014 3 3 1
2015 4 1 2
2016 4 2 3
我理想的结果将返回类似于
的内容 2014 2015 2016
a 3 2 3
b 3 3 3
c 1 2 2
然后我可以将其用作x轴标签的字符串。
编辑: 我的问题已在下面解决。
答案 0 :(得分:1)
这里是tidyverse
的一个选项。我们gather
列从'a'到'c'到'long'格式,以count
和spread
到'wide'格式获取频率计数
library(tidyverse)
dat %>%
gather(key, val, a:c, na.rm = TRUE) %>%
count(year, key) %>%
spread(year, n)
# A tibble: 3 x 4
# key `2014` `2015` `2016`
# <chr> <int> <int> <int>
#1 a 3 2 3
#2 b 3 3 3
#3 c 1 2 2
dat <- structure(list(year = c(2014L, 2014L, 2014L, 2015L, 2015L, 2015L,
2016L, 2016L, 2016L), a = c(1L, 1L, 2L, NA, 1L, 1L, 2L, 1L, 1L
), b = c(1L, 2L, 2L, 3L, 2L, 1L, 1L, 3L, 2L), c = c(NA, NA, 3L,
3L, NA, 1L, 1L, 1L, NA)), class = "data.frame", row.names = c(NA,
-9L))