Table 在 R > 3.4.0 中包括显式 NA
Table including explicit NAs in R > 3.4.0
编辑:已接受的答案帮助我消除了鳞片;此更改是一个改进,毕竟并不烦人。
在table
的帮助文件中,现在是这样写的:
Non-factor arguments a are coerced via factor(a, exclude=exclude).
Since R 3.4.0, care is taken not to count the excluded values (where
they were included in the NA count, previously).
这很烦人。以前,您可以调用 table(x, exclude = NULL)
并明确确认 NA
值的数量。现在,如果有 none,您不会被告知。观察:
vec_with_no_nas <- c("A", "B", "B", "C")
vec_with_nas <- c("A", "B", NA, "C")
table(vec_with_no_nas)
table(vec_with_no_nas, exclude = NULL)
table(vec_with_nas)
table(vec_with_nas, exclude = NULL)
这给出了输出:
> table(vec_with_no_nas)
vec_with_no_nas
A B C
1 2 1
> table(vec_with_no_nas, exclude = NULL)
vec_with_no_nas
A B C
1 2 1
看到了吗?没有明确确认零个 NA。
我真正想要的是类似旧行为的东西,即:
> table(vec_with_no_nas, exclude = NULL)
vec_with_no_nas
A B C <NA>
1 2 1 0
FWIW,如果向量 有 NA 值,table(x, exclude = NULL)
会告诉你:
> table(vec_with_nas)
vec_with_nas
A B C
1 1 1
> table(vec_with_nas, exclude = NULL)
vec_with_nas
A B C <NA>
1 1 1 1
我在基地和 tidyverse
工作。是否有直接 table
替代品可以明确确认没有 NA?
您可以尝试将 useNA 参数设置为 "always"。在 R 3.2.5 中,
table(vec_with_no_nas, useNA="always")
添加一个 NA 列,即使不存在 NA。
vec_with_no_nas
A B C <NA>
1 2 1 0
3.4.0(和 3.2.5)的联机帮助文件说
useNA controls if the table includes counts of NA values.
所以这个论点似乎直接解决了你想做的事情。 exclude 参数允许用户直接从 table 输出中删除因子变量的水平。
table(vec_with_no_nas, exclude="A")
vec_with_no_nas
B C
2 1
这比从构建的 table 对象中删除不需要的级别更干净。
注:
在线 3.4.0 帮助文件提到了同时使用 exclude 和 useNA 参数的病态案例,还提供了一个可能值得进一步探索的示例。
data.table
可用于快速创建汇总表,默认包含NA
s。
# Create Dataset
library(data.table)
df=data.table(V1=c('A','B','B',NA),V2=1:4)
df
# V1 V2
# 1: A 1
# 2: B 2
# 3: B 3
# 4: <NA> 4
# Count Table
df[,.N,by=V1]
# V1 N
# 1: A 1
# 2: B 2
# 3: <NA> 1
# Proportion Table
df[,.N/nrow(df),by=V1]
# V1 V1
# 1: A 0.25
# 2: B 0.50
# 3: <NA> 0.25
编辑:已接受的答案帮助我消除了鳞片;此更改是一个改进,毕竟并不烦人。
在table
的帮助文件中,现在是这样写的:
Non-factor arguments a are coerced via factor(a, exclude=exclude). Since R 3.4.0, care is taken not to count the excluded values (where they were included in the NA count, previously).
这很烦人。以前,您可以调用 table(x, exclude = NULL)
并明确确认 NA
值的数量。现在,如果有 none,您不会被告知。观察:
vec_with_no_nas <- c("A", "B", "B", "C")
vec_with_nas <- c("A", "B", NA, "C")
table(vec_with_no_nas)
table(vec_with_no_nas, exclude = NULL)
table(vec_with_nas)
table(vec_with_nas, exclude = NULL)
这给出了输出:
> table(vec_with_no_nas)
vec_with_no_nas
A B C
1 2 1
> table(vec_with_no_nas, exclude = NULL)
vec_with_no_nas
A B C
1 2 1
看到了吗?没有明确确认零个 NA。
我真正想要的是类似旧行为的东西,即:
> table(vec_with_no_nas, exclude = NULL)
vec_with_no_nas
A B C <NA>
1 2 1 0
FWIW,如果向量 有 NA 值,table(x, exclude = NULL)
会告诉你:
> table(vec_with_nas)
vec_with_nas
A B C
1 1 1
> table(vec_with_nas, exclude = NULL)
vec_with_nas
A B C <NA>
1 1 1 1
我在基地和 tidyverse
工作。是否有直接 table
替代品可以明确确认没有 NA?
您可以尝试将 useNA 参数设置为 "always"。在 R 3.2.5 中,
table(vec_with_no_nas, useNA="always")
添加一个 NA 列,即使不存在 NA。
vec_with_no_nas
A B C <NA>
1 2 1 0
3.4.0(和 3.2.5)的联机帮助文件说
useNA controls if the table includes counts of NA values.
所以这个论点似乎直接解决了你想做的事情。 exclude 参数允许用户直接从 table 输出中删除因子变量的水平。
table(vec_with_no_nas, exclude="A")
vec_with_no_nas
B C
2 1
这比从构建的 table 对象中删除不需要的级别更干净。
注:
在线 3.4.0 帮助文件提到了同时使用 exclude 和 useNA 参数的病态案例,还提供了一个可能值得进一步探索的示例。
data.table
可用于快速创建汇总表,默认包含NA
s。
# Create Dataset
library(data.table)
df=data.table(V1=c('A','B','B',NA),V2=1:4)
df
# V1 V2
# 1: A 1
# 2: B 2
# 3: B 3
# 4: <NA> 4
# Count Table
df[,.N,by=V1]
# V1 N
# 1: A 1
# 2: B 2
# 3: <NA> 1
# Proportion Table
df[,.N/nrow(df),by=V1]
# V1 V1
# 1: A 0.25
# 2: B 0.50
# 3: <NA> 0.25