2017-04-19 57 views
0

我一直在想我如何做到這一點,但到目前爲止我找不到一個簡單的解決方案。 我有以下數據集:重新組合,總結和組合變量

Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4 

我試圖做的是基於Itin變量,創建一個路徑變量,同時保持乘客變量。 理解這一點的最簡單方法是將它看作是在某個地方以規模進行正常飛行。例如,在Itin = 1中,一位乘客從A到B轉到C.唯一需要保留的是起點A目的地B,目的地C和乘客,因爲它等於1.就像下面的示例一樣。

Path Passengers 
A-B-C 1 
A-B  3 
E-B  10 
A-C  2 
E-B  4 

我試過用dplyr GROUP_BY幾個選項,因爲它往往是比基本選項更快,但我不能真正得到的結果作爲一個新的變量Path第二個例子。我也想過使用tidyr,但我不確定它在這裏會有什麼幫助。 關於如何做到這一點的任何想法?

編輯:至於Path變量,結尾爲A-B-CA,B,CA B C並不重要,因爲我只會查看語法。

+0

你能假定數據集是排序嗎?即該航班的第一段是該特定行程的第一行。 – thc

+0

@thc是的,它確實按照我以前做過的那樣排序。 – FilipeTeixeira

回答

2

編輯使用data.table

df1<-read.table(text="Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4",header=TRUE, stringsAsFactors=FALSE) 

library(data.table) 
DT <-data.table(df1) 
DT[,.(Passengers, Path = paste(Origin[1],paste(Destination, collapse = " "), 
           collapse = " ")), by=Itin] 

    Itin Passengers Path 
1: 1   1 A B C 
2: 1   1 A B C 
3: 2   3 A B 
4: 3   10 E B 
5: 4   2 A C 
6: 5   4 E B 

這裏是我的一部開拓創新的解決方案與dplyr一個更快的解決方案:

df1<-read.table(text="Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4",header=TRUE, stringsAsFactors=FALSE) 

library(dplyr) 
df1 %>% 
group_by(Itin) %>% 
summarise(Passengers=max(Passengers), 
      Path = paste(Origin[1],paste(Destination, collapse = " "), 
           collapse = " ")) 

# A tibble: 5 × 3 
    Itin Passengers Path 
    <int>  <int> <chr> 
1  1   1 A B C 
2  2   3 A B 
3  3   10 E B 
4  4   2 A C 
5  5   4 E B 
+0

謝謝。它確實有效。我想知道如果能夠加速9000萬觀測大約需要4分鐘。我一直在用tidyr的unite()來嘗試它,但我不認爲這是一個解決方案。 我也不確定所需時間是由於paste()還是其他原因。 – FilipeTeixeira

+1

@FilipeTeixeira我添加了一個'data.table'解決方案,它應該快得多。如果'dplyr'解決方案需要4分鐘的時間處理現實生活中的數據,我相信'data.table'解決方案需要大約30秒。告訴我需要多長時間,我很好奇。 –

+0

完美地工作。運行'data.table'選項需要大約120秒而不是240,這是相當可觀的,因爲最後這些9000.000的觀測值只有一年的Q1,而我有10年的時間來看。謝謝。你用一個非常簡單的解決方案爲我節省了很多時間:)。 – FilipeTeixeira

0

讀取數據:

read.table(textConnection("Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4"), header=T, stringsAsFactors=F) -> df 

在這種情況下使用基礎R:

Path <- lapply(unique(df$Itin), function(it) { 
    x <- subset(df, Itin==it) 
    c(x$Origin[1], x$Destination) 
}) 
new_df <- unique(df[,c("Itin", "Passengers")]) 
new_df$Path <- Path 

> new_df 
    Itin Passengers Path 
1 1   1 A, B, C 
3 2   3 A, B 
4 3   10 E, B 
5 4   2 A, C 
6 5   4 E, B 
+0

謝謝。不幸的是,因爲我有大約9000000個觀察值,所以這個選項太慢了。我跑了代碼,15分鐘後還沒有結束。這就是爲什麼我更傾向於選擇速度更快的Dplyr選項。 – FilipeTeixeira