在 R 中将非数值因子转换为具有映射的数值列

8

我有一个包含诸如 hotwarmtepidcoldvery coldfreezing 等级别的因子在一个 数据框(data frame) 中。我想将它们映射到一个整数列(用于回归),其值范围为 [-2, 2],一些值映射到相同的内容。我希望能够指定明确的映射关系,例如将 very hot 映射为 2,将 very cold 映射为 -2 ,等等。如何做到清晰明了?我希望有一个只需要传入一些命名列表(named list) 的函数或类似方法。


哎呀,那个踩票真是太狠了。 - Aditya Sihag
2
请注意,[-2, 2] 仅代表5个值,而您的样本级别表示6个值。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto:实际上,他的意思是“一些值映射到相同的值”。 - nico
2个回答

17

假设因子向量 x 包含类别信息。

temperatures <- c("hot", "warm", "tepid", "cold", "very cold", "freezing")
set.seed(1)
x <- as.factor(sample(temperatures, 10, replace=TRUE))
x
[1] warm     tepid    cold     freezing warm     freezing freezing cold    
[9] cold     hot     
Levels: cold freezing hot tepid warm
创建一个数值向量temp.map,其中包含映射信息。请注意,在下面的映射中,“hot”和“warm”映射到同一个值。
temp.map <- c("hot"=2, "warm"=2, "tepid"=1, "cold"=0, "very cold"=-1, "freezing"=-1)    
y <- temp.map[as.character(x)]
y
warm    tepid     cold freezing     warm freezing freezing     cold 
   2        1        0       -1        2       -1       -1        0 
cold      hot 
   0        2 

8

可以使用as.integer将因子轻松地转换为整数。

例如:

>temperatures <- c("Hot", "Warm", "Tiepid", "Cold", "Very cold", "Freezing")
> set.seed(12345)
> a <- sample(temperatures, 10, r=T)
> a <- factor(a, levels = temperatures)
> a
 [1] Very cold Freezing  Very cold Freezing  Tiepid    Hot       Warm     
 [8] Cold      Very cold Freezing 
Levels: Hot Warm Tiepid Cold Very cold Freezing
> as.integer(a)
 [1] 5 6 5 6 3 1 2 4 5 6

如果您需要在[-2;2]范围内,只需执行以下操作:
> as.integer(a)-3
  [1]  2  3  2  3  0 -2 -1  1  2  3

我认为这个解决方案没有满足将多个级别映射到相同数字值的要求。 - Leo
@Leo:啊,我没注意到那部分,你的解决方案对于那个很有效。 - nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接