2017-04-19 56 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