我使用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)
这很难看(恕我直言),但它有效:
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不严格遵守这一点,那将是很好的(恕我直言).
为什么不事后修正名字呢?
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)
| 归档时间: |
|
| 查看次数: |
4381 次 |
| 最近记录: |