在列

时间:2015-10-30 13:45:09

标签: r dplyr

我正在寻找一种有效且轻松地计算列中非NA值与NA值之间的比率的方法。

我所知道的方法是使用dplyr,代码

Data %>% count(filter(!is.na(x2012))) / count(filter(is.na(x2012)))

现在有更简单的方法吗?我认为n_unique包中的dplyr可能是某种东西,但如果你有几个相同的观察结果,那么这个比例就不对了。

3 个答案:

答案 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)

您可以编写简短的辅助函数来计算:

NANA值的比率

(如果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

中没有NA值

答案 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,对于第一行中的示例数据是正确的。