Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中,我可以让table()函数返回命名元素中NA值的数目吗?_R_Na - Fatal编程技术网

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

在R中,我可以让table()函数返回命名元素中NA值的数目吗?,r,na,R,Na,我使用R来总结报告中的大量数据。我希望能够使用lappy()从table()函数生成表列表,从中提取所需的统计信息。有很多这样的函数,所以我写了一个函数来实现它。我的问题是,尽管每个表中都有缺失(NA)值,但返回缺失(NA)值的数量时仍有困难,因为我不知道如何告诉R我想要table()中包含NA值数量的元素。就我所知,R是“命名”那个元素NA…我不能这样称呼它 我试图避免写一些复杂的语句,比如说(is.na(names(element[1]))| names(element[1])==“var_

我使用R来总结报告中的大量数据。我希望能够使用
lappy()
table()
函数生成表列表,从中提取所需的统计信息。有很多这样的函数,所以我写了一个函数来实现它。我的问题是,尽管每个表中都有缺失(
NA
)值,但返回缺失(
NA
)值的数量时仍有困难,因为我不知道如何告诉R我想要
table()
中包含
NA
值数量的元素。就我所知,R是“命名”那个元素
NA
…我不能这样称呼它

我试图避免写一些复杂的语句,比如说
(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"])
我想要的是:

$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
$V1
A.
2       1
V2美元
猫
2     1
$V3
对
2     0
V4美元
对
1     1
$V5
对
2     1
选项卡[匹配(NA,名称(选项卡))]
似乎在
选项卡[NA]
选项卡[NA字符]
选项卡[“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 
f这很难看(IMHO),但它可以工作:

my_table <- function(x){
    setNames(table(x,useNA = "always"),c(sort(unique(x[!is.na(x)])),'NA'))
}
我的记忆是,
NA
因子水平与
“NA”
因子水平之间的区别至少是过去R中的一个混乱来源。我觉得我在r-devel上看到了一些关于这个优点的争论,但我现在还不能确定

因此,问题是,如果你有一个带有
NA
值的因子,你把它叫做什么水平?从技术上讲,这是正确的,其中一个级别是“缺失”而不是字面上的“NA”。如果
table
没有严格遵守这一点,那就太好了。

当您设置
useNA=“always”
时,
table()
总是添加
NA
作为最后的结果,因此一种方法是使用
tail
。假设我们有上面的
列表
(我称之为
l1


为什么不在事情发生后把名字改一下呢

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

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

是的,我一开始也是这么想的右-注意您的列如何包含NA。这很烦人dHanks@joran&TARehman。编辑以修复。这确实是一个奇怪的角落案例,不是吗?我想类似的东西会起作用,但我也认为我错过了一些明显的R功能,可以做到这一点。我同意它不漂亮,但它确实完成了任务。@TARehman它看起来确实像
NA
类别的名称应该设置为字符
,而不是字面上的
NA
。我甚至想不出一个理由,为什么它会有用……同意。我花了大约一个小时才来问,因为我想“这不可能是预期的功能…”:扑通一声看
table
treats
NA
类似
lappy(list\u\u tables,tail,1)
的方法可能有用。。。。
levels(factor(c(1,NA,2),exclude = NULL))
[1] "1" "2" NA 
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"])
l2 <- lapply( list_o_tables , tail , 1 )
mapply( c , l1, l2 , SIMPLIFY = FALSE )
#$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 
tables <- lapply(example[-1], table, useNA = "ifany")

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