将因子变量转换为数值型,再从数值型转换回因子变量

3

我有一个庞大的数据集(9,000,000条记录),其中有两列是因素(409个级别)。 这代表了在某个时期内机场之间的航班情况。 下面的数据集已经完成转换。也就是说,“ORIGIN”和“DEST”已经成为数字形式。

  ORIGIN DEST weight        alpha
      1   24   1195 1.512274e-04
      1   78    844 2.557285e-03
    100    2   1615 3.176266e-17
    100    3   4196 9.111249e-09
    100    7   1221 6.471515e-10
    100   12    725 2.129114e-04

第二个数据集包含所有IATA代码以及对应的纬度和经度。

           City IATA  Latitude Longitude
         Goroka  GKA -6.081690   145.392
         Madang  MAG -5.207080   145.789
    Mount Hagen  HGU -5.826790   144.296
         Nadzab  LAE -6.569803   146.726
   Port Moresby  POM -9.443380   147.220
          Wewak  WWK -3.583830   143.669

当前的流程如下:
  1. 将2个列转换为数字(因为后面需要这样使用)
  2. 将数据集转换为 igraph
  3. 应用筛选算法(这就是为什么要把这些列转换为数字的原因)
  4. 再次将其转换为数据集。
我的问题是,我现在想将我拥有的数字重新转换为之前的因素,因为我需要第二个数据集中的纬度和经度。
有任何想法吗?我已经尝试了我能想到的几乎所有方法。

as.factor 没有起作用,是吗? - Alos
1
as.numeric(as.character(factor(c(1,100,23,47)))). 因为只是将因子转换为数字级别,所以需要先将其转换为字符,然后再转换为数字。在您的情况下,应该使用 as.numeric(as.character(df$ORIGIN)),其中 df 是您的数据框。 - infominer
2个回答

2

在将因子转换为数字之前,我建议您先存储其因子水平,然后在恢复因子类别时重新应用它们。
以下是一个示例以清楚说明我的意思:

data(iris)
# Store the levels
l<-levels(iris$Species)

# Convert to numeric
iris$Species <- as.numeric(iris$Species)
head(iris$Species)
class(iris$Species)

# Convert back to factor
iris$Species <- factor(iris$Species, labels = l)
head(iris$Species)
class(iris$Species)

0
在将因子强制转换为数字之前,创建一个数字-因子标签对的查找表。在工作流程结束时,将因子标签合并回您的数据中。
library(dplyr)
data(warpbreaks)
original <- warpbreaks

value_label_map <- warpbreaks %>%
  select(wool, tension) %>%
  mutate(wool_num = as.numeric(wool), tension_num = as.numeric(tension)) %>%
  distinct()

warpbreaks <- warpbreaks %>%
  mutate(wool = as.numeric(wool), tension = as.numeric(tension))

warpbreaks <- left_join(warpbreaks, value_label_map,
  by = c("wool" = "wool_num", "tension" = "tension_num"))

identical(original$wool, warpbreaks$wool.y)
identical(original$tension, warpbreaks$tension.y)

确实,这解决了我的问题。问题在于我试图找到一种匹配两个数据集的方法,因为最终(由于过滤算法),我总是以较少的列结束。 但是你的方法完美地解决了它 :). 非常感谢你:D。这让我免受巨大的头痛之苦。 - FilipeTeixeira
很高兴听到这个消息!干杯。 - effel

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