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