【问题标题】:How to preserve original values in a variable turned into a factor?如何将变量中的原始值保留为一个因素?
【发布时间】: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


【解决方案1】:

如果您保留用于创建因子的级别和标签向量,则可以使用它们从因子标签向后工作以返回值。

group_levels <- c(1, 2, 3, 9)
group_labels <- c("G1", "G2", "G3", "Unknown")
df1$reconstituted_group_num <- group_levels[as.numeric(df1$group_f)]

这是因为标签向量中的索引值与级别向量中的索引值对齐:Unknown 的索引为 4,其级别为 9。

【讨论】:

  • 我会补充一点,通过一些复杂的经验,我了解到 cut() 是可以的,但 CSV 文件会受到伤害。除了 CSV 文件的其他限制之外,执行此操作时,级别不会与因子一起保存。当您重新读取 CSV 时,一切似乎都很好,但是级别是从唯一的字符串重新创建的,并按字母顺序从列表中索引。如果您最初使用具有不同顺序的列表创建因子,这将导致问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2020-04-23
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多