R:如何根据另一列中的值对序列进行分组

时间:2019-01-31 10:57:11

标签: 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。但是转换仅适用于该单次访问。但是,用户在决定转换之前可能会多次访问该网站。这就是为什么在转换之前不所有访问VIST具有1的值。

编辑结束

此数据集是与在情况下,“马尔可夫链”包,有助于使用。

我不是很有经验的R.任何帮助将非常感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您对结果应该是什么或数据应该如何感到有些困惑。为了获得所需的结果,应该修改数据,因为您不能group_by conversion并在数据中使用conversion将cp medium和us medium 1显示为cpsc和自然,则每次点击费用的USC的 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)) 为0。修改后的数据应如下所示。

enter image description here

userID

在这种情况下,数据将按conversiontimestamp进行分组。(请注意,表中的列称为timeDate,而代码groupedData <- gadata %>% group_by(userID, conversion) %>% arrange(userID, timeDate) %>% summarise(sequence = paste0(medium, collapse = " > ")) %>% select(userID, sequence, conversion) %>% arrange(userID, desc(conversion)) 中)

  <ipSecurity allowUnlisted="#{AllowUnlistedIP}" xdt:Transform="SetAttributes(allowUnlisted)">
    <add xdt:Transform="InsertIfMissing" allowed="true" xdt:Locator="Match(ipAddress)" ipAddress="#{IPAddress1}"/>
    <add xdt:Transform="InsertIfMissing" allowed="true" xdt:Locator="Match(ipAddress)" ipAddress="#{IPAddress2}"/>
    <add xdt:Transform="InsertIfMissing" allowed="true" xdt:Locator="Match(ipAddress)" ipAddress="#{IPAddress3}"/>
    <add xdt:Transform="InsertIfMissing" allowed="true" xdt:Locator="Match(ipAddress)" ipAddress="#{IPAddress4}"/>
    <add xdt:Transform="RemoveAll" xdt:Locator="Match(ipAddress)" ipAddress=""/>
    <add xdt:Transform="Remove" xdt:Locator="Match(ipAddress)" ipAddress=""/>
  </ipSecurity>

然后结果如您所愿: enter image description here