有没有一种方法可以计算数据框的某一列中的观测值并将其另存为字符串?

时间:2019-07-08 15:47:33

标签: r

我正在为一个项目处理图形,并希望在图形底部添加观察值。我用代码完成了 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轴标签的字符串。

编辑: 我的问题已在下面解决。

1 个答案:

答案 0 :(得分:1)

这里是tidyverse的一个选项。我们gather列从'a'到'c'到'long'格式,以countspread到'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))