在R中,我可以让table()函数返回命名元素中NA值的数目吗?
我使用R来总结报告中的大量数据。我希望能够使用在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_
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
treatsNA
类似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)