计算R中每年没有N/A的观测数

Tox*_*Tox 2 r count missing-data dplyr

我有一个数据集,我想总结没有缺失值的观测数量(用NA表示).

我的数据类似如下:

data <- read.table(header = TRUE, 
               stringsAsFactors = FALSE, 
               text="CompanyNumber ResponseVariable Year ExplanatoryVariable1 ExplanatoryVariable2
               1 2.5 2000 1 2
               1 4 2001 3 1
               1 3 2002 NA 7
               2 1 2000 3 NA
               2 2.4 2001 0 4
               2 6 2002 2 9
               3 10 2000 NA 3")
Run Code Online (Sandbox Code Playgroud)

我打算使用包dplyr,但这只需要考虑几年而不是不同的变量:

library(dplyr)
data %>% 
  group_by(Year) %>%
  summarise(number = n())
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得以下结果?

                    2000 2001 2002
ExplanatoryVariable1  2   2    1 
ExplanatoryVariable2  2   2    2
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 7

要获得计数,您可以先使用:

library(dplyr)
data %>% 
  group_by(Year) %>% 
  summarise_at(vars(starts_with("Expla")), ~sum(!is.na(.)))
## A tibble: 3 x 3
#   Year ExplanatoryVariable1 ExplanatoryVariable2
#  <int>                <int>                <int>
#1  2000                    2                    2
#2  2001                    2                    2
#3  2002                    1                    2
Run Code Online (Sandbox Code Playgroud)

如果要像问题中所示重新整形,可以使用tidyr函数扩展管道:

library(tidyr)
data %>% 
  group_by(Year) %>% 
  summarise_at(vars(starts_with("Expla")), ~sum(!is.na(.))) %>% 
  gather(var, count, -Year) %>% 
  spread(Year, count)
## A tibble: 2 x 4
#                   var `2000` `2001` `2002`
#*                <chr>  <int>  <int>  <int>
#1 ExplanatoryVariable1      2      2      1
#2 ExplanatoryVariable2      2      2      2
Run Code Online (Sandbox Code Playgroud)

只是让OP知道,因为他们有~200个解释变量可供选择.您可以使用另一个选项summarise_at来选择变量.您可以简单地命名第一个:last变量,如果它们在数据中正确排序,例如:

data %>% 
  group_by(Year) %>%
  summarise_at(vars(ExplanatoryVariable1:ExplanatoryVariable2), ~sum(!is.na(.))) 
Run Code Online (Sandbox Code Playgroud)

要么:

data %>% 
  group_by(Year) %>% 
  summarise_at(3:4, ~sum(!is.na(.))) 
Run Code Online (Sandbox Code Playgroud)

或者将变量名称存储在向量中并使用:

vars <- names(data)[4:5]
data %>% 
  group_by(Year) %>% 
  summarise_at(vars, ~sum(!is.na(.))) 
Run Code Online (Sandbox Code Playgroud)