将具有公共ID的行压缩到一行

时间:2015-03-11 22:59:42

标签: sql r sqlite

我有一个问题,我没有找到答案。有类似的问题,其解决方案在我的情况下不太起作用。我有一个数据集,有四列,如下例所示:

Name   Session   Sequence   Page
Bob     001       001       home
Bob     001       002       news
Bob     001       003       contact_us
Bob     001       004       home
Sally   001       001       home
Sally   001       002       contact_us
Bob     002       001       home
John    001       001       home
John    001       002       about_us

我想要的是这样的东西

Name    Session   Pages
Bob     001       home-news-contact_us-home
Sally   001       home-contact_us
Bob     002       home
John    001       home-about-us

现在的诀窍是,序列可以是1:44,也可以是介于两者之间的任何地方。我在R中编码并且可以使用SQLite。我还需要在破折号中连接,但这很容易。如果R在SAS中有类似“滞后”的东西,那将会非常简单。

1 个答案:

答案 0 :(得分:3)

你已经有了一些很好的答案,但这里有一个dplyr,希望能提供一些可读性。

library(dplyr)

df %>%
    group_by(Name, Session) %>% # create summary data for each unique group
    summarise(Page = paste0(Page, collapse = "-")) 

给出了

Source: local data frame [4 x 3]
Groups: Name

   Name Session                      Page
1   Bob       1 home-news-contact_us-home
2   Bob       2                      home
3  John       1             home-about_us
4 Sally       1           home-contact_us

重读您的问题似乎页面序列很重要,即您希望finally页面列按顺序从左到右依次访问。因此,我们还包括一个额外的步骤。

library(dplyr)

df %>%
    group_by(Name, Session) %>% # create summary data for each unique group
    arrange(Sequence) %>% # makes sure that Sequence for each group is in ascending order.
    summarise(Page = paste0(Page, collapse = "-"))