【发布时间】:2017-02-08 08:00:17
【问题描述】:
这里有一些工作代码来说明我的问题:
# Categorical variable recorded as numeric (integer)
df1 <- data.frame(group = c(1, 2, 3, 9, 3, 2, 9, 1, 9, 3, 2))
我有一个分类变量 (group) 记录为整数值。对于绘图并将此变量包含在模型中,将其编码为因子,将每个数字映射到描述类别的标签会很有用。所以我创造了一个因素:
# Make it a factor
df1$group_f <- factor(x = df1$group,
levels = c(1, 2, 3, 9),
labels = c("G1", "G2", "G3", "Unknown"))
df1
group group_f
1 1 G1
2 2 G2
3 3 G3
4 9 Unknown
5 3 G3
6 2 G2
7 9 Unknown
8 1 G1
9 9 Unknown
10 3 G3
11 2 G2
现在,问题是最终我需要再次使用原始值(因为我必须基于此变量连接表,而另一个表具有每个类别的原始数字 -1,2,3,9- 而不是标签)。
无法转换为数字(“未知”类别被映射到 4 而不是 9)
# And back to numeric
df1$group_num <- as.numeric(df1$group_f)
df1
group group_f group_num
1 1 G1 1
2 2 G2 2
3 3 G3 3
4 9 Unknown 4
5 3 G3 3
6 2 G2 2
7 9 Unknown 4
8 1 G1 1
9 9 Unknown 4
10 3 G3 3
11 2 G2 2
?factor 说:
as.numeric 应用于一个因子是没有意义的,并且可能发生在 隐性强制。将因子 f 转换为近似其 原始数值,推荐使用 as.numeric(levels(f))[f] 比 as.numeric(as.character(f)) 效率略高。
但是as.numeric 在级别上也不起作用(因为级别现在是带有标签的字符,因此不能强制为数字):
> as.numeric(levels(df1$group_f))
[1] NA NA NA NA
Warning message:
NAs introduced by coercion
有没有办法创建一个因子变量,以便它保留原始值? (本例中为 1,2,3,9)???
注意:我们的想法是拥有一个因子变量,该变量具有描述类别的标签和底层的原始数字。尽管在此示例中,我将变量 group 保留在新创建的因子变量中,但在我的实际用例中,我会/不能这样做(这是一个巨大的数据集)。
【问题讨论】:
-
您通过分配不同的标签基本上消除了信息。您可以通过查看 dput 的返回值看到这一点:
dput(df1) structure(list(group = c(1, 2, 3, 9, 3, 2, 9, 1, 9, 3, 2), group_f = structure(c(1L, 2L, 3L, 4L, 3L, 2L, 4L, 1L, 4L, 3L, 2L), .Label = c("G1", "G2", "G3", "Unknown"), class = "factor")), .Names = c("group", "group_f" ), row.names = c(NA, -11L), class = "data.frame") -
因子在 R 中存储为从 1 开始的整数,因此如果您指定其他标签,除了制作单独的变量之外,没有办法返回。
-
如果您没有分配新标签,那么您可以使用
as.numeric(as.character(df1$group_f))恢复 9,这在 R-FAQ 中进行了讨论。 -
@elikesprogramming 相当尴尬的解决方法:您可以使用
factor(x = df1$group, levels = 1:9, labels = c("G1", "G2", "G3", 4, 5, 6, 7, 8, "Unknown"))从变量中生成因子 在这种情况下,您可以使用as.numeric返回原始数值。还有很多带有标签支持 R 的包。 -
@elikesprogramming 使用查找表怎么样?
标签: r