我使用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
答案 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