【问题标题】:Reshape Long to Wide Data in R [duplicate]将R中的长数据重塑为宽数据
【发布时间】:2016-03-01 18:28:27
【问题描述】:

我正在尝试重塑 R 中的一些用户数据。我有一个会话 ID 的 data.frame。每个会话都有一个 User_ID 和日期。我想使用“User_ID”变量作为我的“Key”,但仅用于具有“New Visitor”的“userType”的观察。因此,每个“新访客”都会有一行。然后将每个后续会话 ID 作为单独的变量传递。例如,如果一个 User ID 总共有 3 个 Session ID,那么总共会有 6 个变量:

例如,如果这是用户的数据框:

    date <- c('2015-01-01','2015-01-02','2015-01-02','2015-01-10')
    userID <- c('100105276','100105276','100105276','100105276')
    sessionID <- c('1452632119','1452634303','1452637067','1453600979')
    userType <- c('New Visitor','Returning Visitor','Returning Visitor','Returning Visitor')
    df <- cbind(date,userID,sessionID,userType)

相反,我想返回这个:

    userID      sessionID1  date1      SessionID2  date2      SesionID3 date3
    100105276   1452632119  2015-01-01 1452634303  2015-01-02 100105276 2015-01-02

如果有任何 userID 没有后续 sessionID,则在变量缺失值的情况下将传递一个“na”值。我已经阅读了使用 tidyr 或 reshape2 来做到这一点,但我无法让他们完全按照我的要求去做。

【问题讨论】:

  • 为什么要删除最后一个回访者行?
  • 我不想放弃它。我只是试图将示例保留在浏览器中的单行上。我想要每个新用户的所有会话。

标签: r reshape2 tidyr


【解决方案1】:

鉴于您的数据按userIDsessionID 排序,并且每一行都是一个唯一的会话,您可以这样做:

library(data.table)

# Transform data into data.frame
df <- data.table(df)
df[, id := sequence(.N), by = c("userID")] # session sequence number per user

# Spread columns
reshape(df, timevar = "id", idvar = "userID", direction = "wide")
#     userID     date.1 sessionID.1  userType.1     date.2 sessionID.2        userType.2     date.3 sessionID.3        userType.3     
#1 100105276 2015-01-01  1452632119 New Visitor 2015-01-02  1452634303 Returning Visitor 2015-01-02  1452637067 Returning Visitor

在此输出中,userType 也包含在变量中,但之后您可以随时删除它们。

【讨论】:

  • 或使用reshape(..., drop = 'userType')
  • 转换成data.table后,可以直接从data.table的dcast的下一个版本进行如下:dcast(df, userID ~ rowid(userID), value.var=c("sessionID", "date", "userType"), sep=".")
  • @Arun nice,哪个版本?
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2021-05-01
  • 2022-07-28
  • 2021-07-03
相关资源
最近更新 更多