R:将因子转换为数字的问题
R: issue with converting factor to numeric
我正在使用从该网站获得的数据集:http://www.ats.ucla.edu/stat/r/dae/mlogit.htm
我想使用一个要求矩阵为数字矩阵的包,所以我使用 data.matrix 将数据框转换为数字矩阵。
这是我的第一个问题:有没有办法判断哪个数字对应于哪个因素?用本站给出的数据集看案例中的数据很容易,但是当我们有数百个因素时,我们如何做到这一点?
我的第二个问题涉及以下代码:
as.numeric(levels(f))[f]
我在另一个 post 上看到,这是将因子转换为数值的最有效方法。但是,在数据集中的其中一列上使用此命令会得到以下结果:
as.numeric(levels(ml$prog))[ml$prog]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[64] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[127] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[190] NA NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
另一方面,如果我只使用以下代码:
as.numeric(ml$prog)
[1] 3 1 3 3 3 1 3 3 3 3 3 2 3 3 3 1 1 3 2 3 1 3 3 3 2 2 1 1 2 2 1 3 2 2 3 3 3 2 1 2 1 2 2 3 2 3 3 1 3 2 2 3 1 2 2 1 2 1 3 1 3 2 2 3 3 3 1 2 2 1 2 2 2 1 3 1 3 1 1 2 3 2 2 1 3 2 1 1 1 3 3 1 3 2 3
[96] 1 2 3 3 1 2 3 3 3 1 2 1 1 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 2 1 1 1 2 2 2 2 2 3 1 2 2 2 2 2 1 1 2 2 2 3 1 2 2 1 1 2 2 3 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2
[191] 2 2 2 2 2 2 3 2 2 2
看来return是我预料中的结果。
为了提供更多背景信息,ml$prog
列具有三个级别的因素:"academic", "general", and "vocation"
。
我认为你的混淆是因为编码的向量不是数字而是字符。如果您需要一个数字,那么您的 as.numeric(ml$prog)
就是正确答案。如果你想访问编码向量然后 as.character(levels(ml$prog))[ml$prog]
我正在使用从该网站获得的数据集:http://www.ats.ucla.edu/stat/r/dae/mlogit.htm
我想使用一个要求矩阵为数字矩阵的包,所以我使用 data.matrix 将数据框转换为数字矩阵。
这是我的第一个问题:有没有办法判断哪个数字对应于哪个因素?用本站给出的数据集看案例中的数据很容易,但是当我们有数百个因素时,我们如何做到这一点?
我的第二个问题涉及以下代码:
as.numeric(levels(f))[f]
我在另一个 post 上看到,这是将因子转换为数值的最有效方法。但是,在数据集中的其中一列上使用此命令会得到以下结果:
as.numeric(levels(ml$prog))[ml$prog]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[64] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[127] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[190] NA NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
另一方面,如果我只使用以下代码:
as.numeric(ml$prog)
[1] 3 1 3 3 3 1 3 3 3 3 3 2 3 3 3 1 1 3 2 3 1 3 3 3 2 2 1 1 2 2 1 3 2 2 3 3 3 2 1 2 1 2 2 3 2 3 3 1 3 2 2 3 1 2 2 1 2 1 3 1 3 2 2 3 3 3 1 2 2 1 2 2 2 1 3 1 3 1 1 2 3 2 2 1 3 2 1 1 1 3 3 1 3 2 3
[96] 1 2 3 3 1 2 3 3 3 1 2 1 1 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 2 1 1 1 2 2 2 2 2 3 1 2 2 2 2 2 1 1 2 2 2 3 1 2 2 1 1 2 2 3 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2
[191] 2 2 2 2 2 2 3 2 2 2
看来return是我预料中的结果。
为了提供更多背景信息,ml$prog
列具有三个级别的因素:"academic", "general", and "vocation"
。
我认为你的混淆是因为编码的向量不是数字而是字符。如果您需要一个数字,那么您的 as.numeric(ml$prog)
就是正确答案。如果你想访问编码向量然后 as.character(levels(ml$prog))[ml$prog]