【问题标题】:Looking to combine multiple rows of data based on common column data希望根据公共列数据组合多行数据
【发布时间】:2018-04-14 02:00:13
【问题描述】:

我正在考虑尝试使用公共列数据合并两个连续的数据行。本质上,我试图从

 UserID Geography   Login  Logout

   user1  East      0:00:22    -       
   user1  East         -     0:01:29
   user2  West      0:03:57    -    
   user2  West         -     0:48:10
   user3  South     0:59:25    -    
   user3  South        -     1:08:21

  UserID Geography   Login  Logout

   user1  East      0:00:22  0:01:29       
   user2  West      0:03:57  0:48:10    
   user3  South     0:59:25  1:08:21   

我提前为格式道歉。我想提一下,像这样的多行包含 user1、user2 等的数据,因此 MAX 或 MIN 等聚合函数不起作用。此外,我正在寻找的解决方案是使用 R 语言,但也欢迎使用任何其他语言。

提前致谢, 戈帕尔

【问题讨论】:

    标签: r preprocessor


    【解决方案1】:

    这可以通过 dplyrtidyr 包来完成。本质上,我们将登录和注销时间收集到一个列中,删除空值,并将登录和注销事件重新分布到它们自己的列中。

    df1 <- read.table(text = 'UserID Geography   Login  Logout
    
                  user1  East      0:00:22    -       
                  user1  East         -     0:01:29
                  user2  West      0:03:57    -    
                  user2  West         -     0:48:10
                  user3  South     0:59:25    -    
                  user3  South        -     1:08:21', header = T)
    
      UserID Geography   Login  Logout
    1  user1      East 0:00:22       -
    2  user1      East       - 0:01:29
    3  user2      West 0:03:57       -
    4  user2      West       - 0:48:10
    5  user3     South 0:59:25       -
    6  user3     South       - 1:08:21
    
    library(dplyr)
    library(tidyr)
    df2 <- df1 %>% 
      gather(action, time, -UserID, -Geography) %>% 
      filter(time != '-') %>% 
      spread(action, time)
    
      UserID Geography   Login  Logout
    1  user1      East 0:00:22 0:01:29
    2  user2      West 0:03:57 0:48:10
    3  user3     South 0:59:25 1:08:21
    

    处理多个会话

    在 OP 的原始数据集中,每个用户可以多次登录:

    df <- read.table(text = 'UserID Geography   EventType ChannelType   Time 
    user4   South   Log-in  Web 0:00:10 
    user1   East    Log-in  Web 0:00:22 
    user4   South   Log-out Mobile  0:00:44 
    user1   East    Log-out Web 0:01:29 
    user5   East    Log-in  Web 0:02:01 
    user1   East    Log-in  Mobile 0:03:57 
    user16  South   Log-in  Mobile  0:04:36 
    user15  North   Log-in  Mobile  0:05:42 
    user3   North   Log-in  Web 0:05:59 
    user8   South   Log-in  Mobile  0:07:09 
    user19  North   Log-in  Mobile  0:09:22 
    user11  North   Log-in  Web 0:12:39 
    user8   South   Log-out Web 0:18:32 
    user8   South   Log-in  Web 0:19:35', header = T, stringsAsFactors = F)
    

    关键是使用 dplyr 对每个用户的登录和注销进行分组,然后对它们进行编号。现在,每个登录/注销配对都得到了唯一标识,可以重新格式化数据:

    df2 <- df %>% 
      arrange(UserID, Time) %>% 
      group_by(UserID, EventType) %>% 
      mutate(EventNum = 1:n()) %>% 
      select(-ChannelType) %>% 
      spread(EventType, Time, fill = '-') %>% 
      arrange(`Log-in`)
    
       UserID Geography EventNum `Log-in` `Log-out`
        <chr>     <chr>    <int>    <chr>     <chr>
     1  user4     South        1  0:00:10   0:00:44
     2  user1      East        1  0:00:22   0:01:29
     3  user5      East        1  0:02:01         -
     4  user1      East        2  0:03:57         -
     5 user16     South        1  0:04:36         -
     6 user15     North        1  0:05:42         -
     7  user3     North        1  0:05:59         -
     8  user8     South        1  0:07:09   0:18:32
     9 user19     North        1  0:09:22         -
    10 user11     North        1  0:12:39         -
    11  user8     South        2  0:19:35         -
    

    【讨论】:

    • 感谢@jdobres 的及时回复。我怀疑我是否正确地提出了问题陈述,但你完全正确地理解了它。我试过了,它给了我一个不同的错误,如下所述:错误:行的重复标识符(1、2、3...32、33、34)、(380、381、382、... 402、403, 404), ... 我相信这是由于 UserID 和 Geography 列中的重复值。有没有办法解决这个问题?
    • 给定用户是否可以有多个登录/注销时间?如果是这样,请提供一个示例,说明您的数据集中的情况。
    • 再次感谢您的回复。以下是数据最初的样子 UserID Geography EventType ChannelType Time user4 South Log-in Web 0:00:10 user1 East Log-in Web 0:00:22 user4 South Log-out Mobile 0:00:44 user1 East Log-out Web 0:01:29 user5 East 登录 Web 0:02:01 user1 East 登录手机 0:03:57 user16 South 登录手机 0:04:36 user15 North 登录手机 0:05:42 user3 北登录 Web 0:05:59 user8 South 登录手机 0:07:09 user19 北登录手机 0:09:22 user11 北登录 Web 0:12:39 user8 南注销 Web 0:18:32 user8 South 登录网站 0:19:35
    • 我再次为格式道歉。我想澄清一下,原始数据集中有 5 列,即 UserID、Geography、EventType、ChannelType 和 Time。 EventType 是登录或注销,时间是活动的时间(登录或注销)。我已经得到了我在问题中提到的格式的数据。这是我正在努力解决的数据预处理的最后阶段。我可以确认错误是与 spread(action, time) 的最终命令有关。
    • 再次感谢@jdobres 抽出时间回答这个问题。我看到代码与数据集的顶部(头部)完美配合,但在数据集的尾部或末尾看到了一些问题。但是,让我尝试了解可能导致此问题的原因并返回。再次非常感谢您花时间在这上面。
    猜你喜欢
    • 2020-09-26
    • 2021-08-25
    • 2019-04-15
    • 2016-12-09
    • 2023-02-26
    • 2017-09-03
    • 1970-01-01
    相关资源
    最近更新 更多