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

时间:2013-12-06 22:34:15

标签: r na

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

我试图避免在我说NA之类的地方写一些复杂的陈述,因为我觉得这真的很罗嗦。我希望有一些方法可以告诉R用每个表中的which(is.na(names(element[1]))) | names(element[1])=="var_I_want"变量标记一个字符名称,或者告诉它选择一个标记为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"])

我想要的是什么:

$V1
A 
2 

$V2
Cat 
  2 

$V3
Yes 
  2 

$V4
Yes 
  1 

$V5
Yes 
  2

4 个答案:

答案 0 :(得分:5)

这很丑陋(恕我直言)但它有效:

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

所以你改为lapply,然后你就可以访问NA列了。

仔细观察,这取决于factor

的行为
levels(factor(c(1,NA,2),exclude = NULL))
[1] "1" "2" NA 

我的回忆是,NA"NA"因素水平之间的区别至少是过去R中混淆的根源。我觉得我在r-devel上看过一些关于这个优点的辩论,但我现在不能回想起来。

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

答案 1 :(得分:3)

tab[match(NA, names(tab))]似乎适用于tab[NA]tab[NA_character_]tab["NA_character_"]tab["<NA>"]等等失败...

f <- function(nms, obj) {
    obj[sapply(c(nms, NA), function(X) match(X, names(obj)))]
}

f("Cat", list_o_tables[["V2"]])
#  Cat <NA> 
#    2    1 

mapply(f, list("A", "Cat", "Yes", "Yes", "Yes"), list_o_tables, SIMPLIFY=FALSE)
# [[1]]
# 
#    A <NA> 
#    2    1 
# 
# [[2]]
# 
#  Cat <NA> 
#    2    1 
# 
# [[3]]
# 
#  Yes <NA> 
#    2    0 
# 
# [[4]]
# 
#  Yes <NA> 
#    1    1 
# 
# [[5]]
# 
#  Yes <NA> 
#    2    1 

答案 2 :(得分:3)

为什么不在事后确定姓名?

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

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

答案 3 :(得分:2)

当您设置useNA="always"时,table() 总是添加NA作为最后结果,因此一种方法是使用{{1}对你有利。假设我们上面有tail(我称之为list)...

l1

我们可以获得l1 <- 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"]) 然后像这样加入它们。

NA