在R中,我可以使table()函数返回命名元素中的NA值的数量吗?

TAR*_*man 5 r na

我使用R来汇总报告的大量数据.我希望能够使用lapply()table()函数生成表的列表,从中我可以提取所需的统计信息.有很多这些,所以我写了一个函数来做到这一点.我的问题是我很难返回missing(NA)值的数量,即使我在每个表中都有,因为我无法弄清楚如何告诉R我希望元素table()保存NA值的数量.据我所知,R是"命名"那个元素NA......我不能称之为.

我试图避免写一些复杂的陈述,我说的是which(is.na(names(element[1]))) | names(element[1])=="var_I_want"因为我觉得这只是罗嗦.我希望有一些方法可以告诉R NA用每个表中的变量标记一个字符名称,或者告诉它选择标记的变量NA,但我还没有太多运气.

最小的例子:

example <- data.frame(ID=c(10,20,30,40,50),
                      V1=c("A","B","A",NA,"C"),
                      V2=c("Dog","Cat",NA,"Cat","Bunny"),
                      V3=c("Yes","No","No","Yes","No"),
                      V4=c("No",NA,"No","No","Yes"),
                      V5=c("No","Yes","Yes",NA,"No"))

varlist <- c("V1","V2","V3","V4","V5")

list_o_tables <- lapply(X=example[varlist],FUN=table,useNA="always")

list(V1=list_o_tables[["V1"]]["A"],
     V2=list_o_tables[["V2"]]["Cat"],
     V3=list_o_tables[["V3"]]["Yes"],
     V4=list_o_tables[["V4"]]["Yes"],
     V5=list_o_tables[["V5"]]["Yes"])
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

$V1
A 
2 

$V2
Cat 
  2 

$V3
Yes 
  2 

$V4
Yes 
  1 

$V5
Yes 
  2
Run Code Online (Sandbox Code Playgroud)

我想要的是什么:

$V1
A     <NA>
2       1

$V2
Cat   <NA>
  2     1

$V3
Yes   <NA> 
  2     0

$V4
Yes   <NA> 
  1     1

$V5
Yes   <NA> 
  2     1
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 5

这很难看(恕我直言),但它有效:

my_table <- function(x){
    setNames(table(x,useNA = "always"),c(sort(unique(x[!is.na(x)])),'NA'))
}
Run Code Online (Sandbox Code Playgroud)

所以你这样lapply做了,然后你就可以访问该NA列了.

仔细观察,这取决于以下行为factor:

levels(factor(c(1,NA,2),exclude = NULL))
[1] "1" "2" NA 
Run Code Online (Sandbox Code Playgroud)

我的回忆是的因子水平之间的区别NA"NA"一直处于混乱的R中过去最起码的来源.我觉得我在r-devel上看过一些关于这个优点的争论,但我现在不能回想起来.

所以问题是,如果你有一个NA价值因素,你称之为什么水平?从技术上讲,这是正确的,其中一个级别是"缺失"而不是字面上的"NA".如果table不严格遵守这一点,那将是很好的(恕我直言).


had*_*ley 5

为什么不事后修正名字呢?

tables <- lapply(example[-1], table, useNA = "ifany")

fix_names <- function(x) {
  names(x)[is.na(names(x))] <- "<NA>"
  x
}
lapply(tables, fix_names)
Run Code Online (Sandbox Code Playgroud)