2017-02-15 105 views
1

我有一個海量數據集(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. 將轉換成在data.set IGRAPH
  3. 應用過濾算法(這就是爲什麼列是數字)
  4. 再次轉換爲數據集。

我的問題是我現在想把我有的數字轉換回前面的因素,因爲我需要第二個數據集的經度和緯度。

任何想法?我已經嘗試了幾乎所有我能想到的東西。

+0

as.factor沒有工作我拿? – Alos

+0

as.numeric(as.character(factor(c(1,100,23,47))))。 只是做因素會給它數字水平。所以轉換爲字符,然後轉換爲數字,所以在你的情況下這樣'as.numeric(as.character(df $ ORIGIN))',其中df是你的data.frame – infominer

回答

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) 
+0

謝謝。 的確,這解決了我的問題。問題是我試圖找到一種匹配兩個data.set的方法(由於過濾算法),所以我總是以較少的列結束。 但你的方式完美解決了:)。 非常感謝你:D。這讓我從頭痛中解脫出來。 – FilipeTeixeira

+0

很高興聽到它!乾杯。 – effel

1

在將它轉換爲數字型之前,我會存儲您的因子級別,然後在恢復因子類別時重新應用它們。
一個例子來清除我在說什麼:

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)