我正在寻找一种有效且轻松地计算列中非NA值与NA值之间的比率的方法。
我所知道的方法是使用dplyr,代码
Data %>% count(filter(!is.na(x2012))) / count(filter(is.na(x2012)))
现在有更简单的方法吗?我认为n_unique
包中的dplyr
可能是某种东西,但如果你有几个相同的观察结果,那么这个比例就不对了。
答案 0 :(得分:3)
不需要特定功能,只需执行以下基础R
:
colSums(is.na(df))/colSums(!is.na(df))
# a b c
#2.0 0.5 Inf
对于特定的一组列:
colSums(is.na(df))/colSums(!is.na(df)) # works also with one value aka 'a'
数据:强>
df = data.frame(a=c(NA,NA,4),b=c(NA,1,2),c=c(NA,NA,NA))
答案 1 :(得分:2)
您可以编写简短的辅助函数来计算:
非NA
与NA
值的比率
(如果Inf
值为零,则会返回NA
:
valid_ratio <- function(vec){
sum(!is.na(vec)) / sum(is.na(vec))
}
NA的记录百分比
(传达相同的信息,更容易理解):
perc_NA <- function(vec){
sum(is.na(vec)) / length(vec)
}
您可以将它们与dplyr的summarise
一起使用,如下所示:
mtcars %>%
summarise(percent_NA = perc_NA(am))
percent_NA
1 0
(mtcars$am
)
答案 2 :(得分:1)
count
效果很好:
data.frame(a=rep(c(1,NA),c(3,7))) %>%
count( isNA = is.na(a) ) %>%
summarise( ratio = n[!isNA] / n[isNA] )
ratio
(dbl)
1 0.4285714
这是比率3/7,对于第一行中的示例数据是正确的。