R-将因子转换为具有特定映射的数值

R-将因子转换为具有特定映射的数值,r,dataframe,R,Dataframe,假设我读取了一个数据帧,其中一列包含字符串作为因子。我想将因子转换为数值,但要使用特定的映射。此转换通常是后续计算的先行步骤。例如: > library(rpart) > head(car90["Type"]) Type Acura Integra Small Acura Legend Medium Audi 100 Medium Audi 80 Compact BMW 325i Compact BMW 5

假设我读取了一个数据帧,其中一列包含字符串作为因子。我想将因子转换为数值,但要使用特定的映射。此转换通常是后续计算的先行步骤。例如:

> library(rpart)

> head(car90["Type"])
                 Type
Acura Integra   Small
Acura Legend   Medium
Audi 100       Medium
Audi 80       Compact
BMW 325i      Compact
BMW 535i       Medium

> summary(car90$Type)
Compact   Large  Medium   Small  Sporty     Van    NA's 
     19       7      26      22      21      10       6
在car90$Type列中,我想将“紧凑型”设置为-10,“大型”设置为-1,“中型”设置为0,“小型”设置为1,“运动型”设置为10,“厢式”设置为20,其中数字是数字,而不是因数。我该怎么做

我已经研究过相关问题,但没有一个能提供解决方案


我只会使用矢量订阅;下面是一个例子:

R>a <- as.factor(c("C", "L", "M", "L", "C"))
R>a
[1] C L M L C
Levels: C L M
R>b <- c(C=-10,L=-1,M=0)
R>b
  C   L   M 
-10  -1   0 
R>
R>b[a]
  C   L   M   L   C 
-10  -1   0  -1 -10 
R>
R>a
[1] C L M L C
级别:CLM
R> b b
C L M
-10  -1   0 
R>
R> b[a]
C L M L C
-10  -1   0  -1 -10 
R>
您可以试试这个

x <- c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van') 
y <-  factor(x, levels = c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van'), 
    labels = c(-10, -1, 0, 1, 10, 20))
as.numeric(as.character(y))


[1] -10  -1   0   1  10  20

x这是一个连接操作

encode <- data.frame(Type = c("Compact", "Large", "Medium", "Small", "Sporty", "Van"), TypeValue = c(-10,-1,0,1,10,20))

car90 <- merge(car90, encode, all.x = TRUE)

# or using dplyr
library(dplyr)
car90 <- left_join(car90, encode)
encode使用merge(),如下例所示

首先创建一个包含所需值的数据框。在这个场景中,您将编写

 dictionary <- data.frame(Type = c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van'),
                     Values = c(-10, -1, 0, 1, 10, 20))

 output <- merge(car90$Type, dictionary)
字典只需重置级别:

levels(car90$Type) <- c(-10, -1, 0, 1, 10, 20)

尽管要小心,但如果您打算在此基础上进行计算,则必须将
作为.numeric(levels(fac))[fac]
以确保计算的是数字,而不是基础因子整数值。

正如@NealFultz所指出的,向量下标可以实现这一点。但必须注意如何执行此操作:

x <- car90$Type[1:10]
#[1] Small   Medium  Medium  Compact Compact Medium  Medium  Large   Large   <NA>
#Levels: Compact Large Medium Small Sporty Van
如果您在
VAL
中更改顺序,则会发生此问题,例如:

vals <- c(Large=-1,Compact=-10,Medium=0,Small=1,Sporty=10,Van=20)
vals[x]
#  Small  Medium  Medium   Large   Large  Medium  Medium Compact Compact    <NA> 
#      1       0       0      -1      -1       0       0     -10     -10      NA 

我还需要把它保存回数据框,对吗?我可以做
car90$Type谢谢。但90美元的车型已经是一个因素。有没有办法在第一步中只分配标签,而不是将car90$Type设置为新因子?我建议避免直接将标签分配给因子。创造一个新的因素将更加安全,避免许多潜在问题。您可能需要检查结果并调用as.character将因子转换为字符,然后转换新因子。
x <- car90$Type[1:10]
#[1] Small   Medium  Medium  Compact Compact Medium  Medium  Large   Large   <NA>
#Levels: Compact Large Medium Small Sporty Van
vals <- c(Compact=-10,Large=-1,Medium=0,Small=1,Sporty=10,Van=20)
vals[x]
vals[x]
#  Small  Medium  Medium Compact Compact  Medium  Medium   Large   Large    <NA> 
#      1       0       0     -10     -10       0       0      -1      -1      NA 
vals <- c(Large=-1,Compact=-10,Medium=0,Small=1,Sporty=10,Van=20)
vals[x]
#  Small  Medium  Medium   Large   Large  Medium  Medium Compact Compact    <NA> 
#      1       0       0      -1      -1       0       0     -10     -10      NA 
vals <- c(Large=-1,Compact=-10,Medium=0,Small=1,Sporty=10,Van=20)
vals[as.character(x)]
#  Small  Medium  Medium Compact Compact  Medium  Medium   Large   Large    <NA> 
#      1       0       0     -10     -10       0       0      -1      -1      NA