计算 R 中每年没有 N/A 的观察次数
Count number of observations without N/A per year in R
我有一个数据集,我想总结没有缺失值的观察次数(用 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")
我打算使用包 dplyr,但它只考虑了年份而不是不同的变量:
library(dplyr)
data %>%
group_by(Year) %>%
summarise(number = n())
如何获得以下结果?
2000 2001 2002
ExplanatoryVariable1 2 2 1
ExplanatoryVariable2 2 2 2
要获取计数,您可以先使用:
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
如果您想按照问题所示重塑它,可以使用 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
只是让 OP 知道,因为他们有 ~200 个解释变量 select。您可以使用 summarise_at
的另一个选项来 select 变量。如果数据中的顺序正确,您可以简单地命名 first:last 变量,例如:
data %>%
group_by(Year) %>%
summarise_at(vars(ExplanatoryVariable1:ExplanatoryVariable2), ~sum(!is.na(.)))
或:
data %>%
group_by(Year) %>%
summarise_at(3:4, ~sum(!is.na(.)))
或者将变量名存储在向量中并使用它:
vars <- names(data)[4:5]
data %>%
group_by(Year) %>%
summarise_at(vars, ~sum(!is.na(.)))
data %>%
gather(cat, val, -(1:3)) %>%
filter(complete.cases(.)) %>%
group_by(Year, cat) %>%
summarize(n = n()) %>%
spread(Year, n)
# # A tibble: 2 x 4
# cat `2000` `2001` `2002`
# * <chr> <int> <int> <int>
# 1 ExplanatoryVariable1 2 2 1
# 2 ExplanatoryVariable2 2 2 2
应该做的。您首先将数据堆叠起来,然后简单地计算年份和每个解释变量的 n。如果您希望数据恢复为宽格式,则使用 spread
,但无论哪种方式,如果不使用 spread
,您都会得到两个变量的计数。
你可以在 base R 中使用 aggregate
来做到这一点。
aggregate(list(ExplanatoryVariable1 = data$ExplanatoryVariable1,
ExplanatoryVariable2 = data$ExplanatoryVariable2),
list(Year = data$Year),
function(x) length(x[!is.na(x)]))
# Year ExplanatoryVariable1 ExplanatoryVariable2
#1 2000 2 2
#2 2001 2 2
#3 2002 1 2
使用基数 R:
do.call(cbind,by(data[3:5], data$Year,function(x) colSums(!is.na(x[-1]))))
2000 2001 2002
ExplanatoryVariable1 2 2 1
ExplanatoryVariable2 2 2 2
总计:
aggregate(.~Year,data[3:5],function(x) sum(!is.na(x)),na.action = function(x)x)
我有一个数据集,我想总结没有缺失值的观察次数(用 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")
我打算使用包 dplyr,但它只考虑了年份而不是不同的变量:
library(dplyr)
data %>%
group_by(Year) %>%
summarise(number = n())
如何获得以下结果?
2000 2001 2002
ExplanatoryVariable1 2 2 1
ExplanatoryVariable2 2 2 2
要获取计数,您可以先使用:
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
如果您想按照问题所示重塑它,可以使用 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
只是让 OP 知道,因为他们有 ~200 个解释变量 select。您可以使用 summarise_at
的另一个选项来 select 变量。如果数据中的顺序正确,您可以简单地命名 first:last 变量,例如:
data %>%
group_by(Year) %>%
summarise_at(vars(ExplanatoryVariable1:ExplanatoryVariable2), ~sum(!is.na(.)))
或:
data %>%
group_by(Year) %>%
summarise_at(3:4, ~sum(!is.na(.)))
或者将变量名存储在向量中并使用它:
vars <- names(data)[4:5]
data %>%
group_by(Year) %>%
summarise_at(vars, ~sum(!is.na(.)))
data %>%
gather(cat, val, -(1:3)) %>%
filter(complete.cases(.)) %>%
group_by(Year, cat) %>%
summarize(n = n()) %>%
spread(Year, n)
# # A tibble: 2 x 4
# cat `2000` `2001` `2002`
# * <chr> <int> <int> <int>
# 1 ExplanatoryVariable1 2 2 1
# 2 ExplanatoryVariable2 2 2 2
应该做的。您首先将数据堆叠起来,然后简单地计算年份和每个解释变量的 n。如果您希望数据恢复为宽格式,则使用 spread
,但无论哪种方式,如果不使用 spread
,您都会得到两个变量的计数。
你可以在 base R 中使用 aggregate
来做到这一点。
aggregate(list(ExplanatoryVariable1 = data$ExplanatoryVariable1,
ExplanatoryVariable2 = data$ExplanatoryVariable2),
list(Year = data$Year),
function(x) length(x[!is.na(x)]))
# Year ExplanatoryVariable1 ExplanatoryVariable2
#1 2000 2 2
#2 2001 2 2
#3 2002 1 2
使用基数 R:
do.call(cbind,by(data[3:5], data$Year,function(x) colSums(!is.na(x[-1]))))
2000 2001 2002
ExplanatoryVariable1 2 2 1
ExplanatoryVariable2 2 2 2
总计:
aggregate(.~Year,data[3:5],function(x) sum(!is.na(x)),na.action = function(x)x)