首页 > 解决方案 > R:如何根据来自其他列的值对序列进行分组

问题描述

--已编辑--

我有一个如下例所示的数据框。

+--------+-------------------------------+-----------+------------+
| userID |           timestamp           |  medium   | conversion |
+--------+-------------------------------+-----------+------------+
| us001  | 2019-01-18T00:11:55.385+00:00 | cpc       |          0 |
| us001  | 2019-01-18T00:12:35.385+00:00 | organic   |          1 |
| us001  | 2019-01-19T00:15:25.385+00:00 | referral  |          0 |
| us001  | 2019-01-19T00:15:25.385+00:00 | social    |          0 |
| us001  | 2019-01-19T00:17:25.385+00:00 | organic   |          0 |
| us002  | 2019-01-19T00:17:20.385+00:00 | organic   |          0 |
| us003  | 2019-01-18T00:11:55.385+00:00 | cpc       |          0 |
| us003  | 2019-01-18T00:12:35.385+00:00 | cpc       |          0 |
| us003  | 2019-01-19T00:15:25.385+00:00 | orgnanic  |          1 |
| us003  | 2019-01-19T00:15:25.385+00:00 | referral  |          0 |
| us003  | 2019-01-19T00:17:25.385+00:00 | referral  |          0 |
+--------+-------------------------------+-----------+------------+

我想做的是根据时间对序列进行分组,但我也想根据转换来打破序列。

所以结果将类似于下面的示例。

+--------+----------------------------+------------+
| userID |          sequence          | conversion |
+--------+----------------------------+------------+
| us001  | cpc > organic              |          1 |
| us001  | referra > social > organic |          0 |
| us002  | organic                    |          0 |
| us003  | cpc > cpc > organic        |          1 |
| us003  | referra > referral         |          0 |
+--------+----------------------------+------------+

我使用下面的代码来创建序列并根据用户 ID 和时间对行进行分组。

groupedData <- gadata %>% 
               arrange(userID, timeDate) %>% 
               group_by(userID) %>% 
               mutate(sequence = paste0(medium, collapse = " > "))

但是我很难使用列转换中的第二个值对数据进行分组。

编辑

我想要实现的是对序列进行分组,直到记录转换并等于 1。如果同一用户在他/她转换后的最后一次访问后再次访问该站点,则应对转换后的下一次访问进行分组作为同一用户的新的单独序列,直到记录另一个转换。我希望这更有意义。

数据框中的每个原始数据都是一次访问,并非每次访问都会导致转换。所以很多访问都会有一个转化价值“0”。用户转化的那一刻,转化的价值将变为 1。但转化仅适用于单次访问。但是,用户在决定转换之前可能会多次访问该网站。这就是为什么转化访问之前并非所有访问的值都为 1 的原因。

编辑结束

如果有帮助,此数据集将与“markovchain”包一起使用。

我对 R 不是很有经验。任何帮助将不胜感激。

谢谢你。

标签: r

解决方案


我认为您对结果应该是什么或数据应该如何感到有些困惑。为了得到你想要的结果,数据应该被修改,因为你不能在你的数据中为 us001group_by conversion显示conversion1 和 as cpscmedium和organic,cpcmedium为 us001 显示 0。修改后的数据应如下所示。

在此处输入图像描述

 gadata <- tibble(userID = c('us001','us001','us001','us001','us001','us002','us003','us003','us003','us003','us003'),
               timeDate = c('2019-01-18T00:11:55.385+00:00','2019-01-18T00:12:35.385+00:00','2019-01-19T00:15:25.385+00:00','2019-01-19T00:15:25.385+00:00',
                            '2019-01-19T00:17:25.385+00:00','2019-01-19T00:17:20.385+00:00','2019-01-18T00:11:55.385+00:00','2019-01-18T00:12:35.385+00:00',
                            '2019-01-19T00:15:25.385+00:00','2019-01-19T00:15:25.385+00:00','2019-01-19T00:17:25.385+00:00'),
               medium = c('cpc','organic','referral','social','organic','organic','cpc','cpc','orgnanic','referral','referral'),
               conversion = c(1,1,0,0,0,0,1,1,1,0,0))

在这种情况下,数据将按 和 分组userIDconversion(请注意,在您的表中,一列被调用timestamp,但在您的代码中timeDate

groupedData <- gadata %>% 
      group_by(userID, conversion) %>% 
      arrange(userID, timeDate) %>% 
      summarise(sequence = paste0(medium, collapse = " > ")) %>%
      select(userID, sequence, conversion) %>%
      arrange(userID, desc(conversion))

然后结果如你所问: 在此处输入图像描述


推荐阅读