r - 为什么从因子变量的文档中强制这个因子变量会返回几个 NA?
问题描述
factor 的文档将此代码作为构造因子变量的第一个示例:
(ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))
所述文件建议以下内容:
建议将因子转换
f
为近似其原始数值,as.numeric(levels(f))[f]
并且比as.numeric(as.character(f))
.
但是当我在他们的例子中尝试这些时,我会胡说八道:
> (ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
> ff
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
> as.numeric(levels(ff))[ff]
[1] NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
> as.numeric(as.character(ff))
[1] NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
我的误解在哪里?我看不到ff
因子变量有任何异常。它肯定有潜在的数字:
> as.integer(ff)
[1] 19 20 1 20 9 19 20 9 3 19
尽管它的级别是字符,但我也没有看到任何奇怪的地方 - 因子变量总是具有字符级别。
解决方案
一旦你创建了 ff 运行这个:table(ff)
,它会告诉你每个字母表的频率,即使那些不存在的字母表,这些频率对应的是 0。
现在levels(ff)
将所有这些字母作为字符返回,将它们包裹在里面as.numeric(levels(ff))
将始终返回 NA。也是如此as.numeric(as.character(ff))
。
我的猜测是你可能会混淆labels
和levels
。如果你跑步,labels(ff)
那么你会得到数字 1 到 10 的引用。如果您使用as.numeric()
. 您将获得 10 个数字的结果。跑:as.numeric(labels(ff))
我希望这能解释你的困惑。否则请告诉我。
输出 :
R>table(ff)
ff
a b c d e f g h i j k l m n o p q r
1 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0
s t u v w x y z
3 3 0 0 0 0 0 0
R>levels(ff)
[1] "a" "b" "c" "d" "e" "f" "g" "h"
[9] "i" "j" "k" "l" "m" "n" "o" "p"
[17] "q" "r" "s" "t" "u" "v" "w" "x"
[25] "y" "z"
R>labels(ff)
[1] "1" "2" "3" "4" "5" "6"
[7] "7" "8" "9" "10"
编辑:
好的,看来 OP 在文档中的这一行存在问题:
因子的解释取决于代码和“级别”属性。只注意比较具有相同水平集的因子(以相同的顺序)。特别是,应用于因子的 as.numeric 是没有意义的,并且可能通过隐式强制发生。要将因子 f 转换为近似其原始数值,建议使用 as.numeric(levels(f))[f],并且比 as.numeric(as.character(f)) 稍微高效一些。
现在上面说如果你有因子(最初是数字),不要直接将它们转换为数字,例如:
nums <- c(1, 2, 3, 10)
new_fact <- as.factor(nums)
现在,如果我们尝试从 new_fact 获取数字并运行,as.numeric(new_fact)
我们将得到 1,2,3,4(错误)!!!现在这是错误的,所以所有文档都说要转换为原始数字,必须执行as.numeric(as.character(new_fact))
or as.numeric(levels(new_fact))[new_fact]
,两者都会返回1 2 3 10
。我希望这有帮助
推荐阅读
- mysql - 如何为大型文件管理应用程序设计 mysql 数据库?
- scala - spark:如何将行合并到 jsons 数组
- c++ - 无法将参数 1 的字符串转换为 char*
- android - 更改 RecyclerView 行中元素的可见性 OnClick
- webpack - 如何在 Webpack 中使用带有 ES6 功能的 Jest
- django - 需要一本字典,但得到了 str Django Rest Framework
- c# - 如果需要,我是否需要 IEnumerator 通过 foreach 循环运行通用列表,它是如何实现的
- php - 将一个功能一分为二
- c++ - 在 Visual Studio 2017 C++ 项目中提升 C++ 库 - “无法打开包含文件”
- mongodb - MongoDB - 使用嵌套对象和可变键进行聚合