重组,汇总和组合变量

时间:2017-04-19 20:53:48

标签: r dplyr tidyr

我一直在理解如何做到这一点,但到目前为止,我找不到一个简单的解决方案。 我有以下数据集:

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到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,则无关紧要,因为我只会查看语法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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