在 R 中将长数据重塑为宽数据
Reshape Long to Wide Data in R
我正在尝试在 R 中重塑一些用户数据。我有 data.frame 个会话 ID。每个会话都有一个 User_ID 和日期。我想将 "User_ID" 变量用作我的 "Key",但仅用于具有 "userType" 或 "New Visitor" 的观察。因此,每个 "New Visitor" 将有一行。然后将每个后续会话 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)
相反,我想 return 这个:
userID sessionID1 date1 SessionID2 date2 SesionID3 date3
100105276 1452632119 2015-01-01 1452634303 2015-01-02 100105276 2015-01-02
如果有任何没有后续会话 ID 的用户 ID,将在变量缺失值的地方传递 "na" 值。我已经阅读了有关使用 tidyr 或 reshape2 来执行此操作的信息,但我无法让它们完全按照我的要求进行操作。
鉴于您的数据按 userID
和 sessionID
排序,并且每一行都是一个唯一的会话,您可以:
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
也作为变量包含在内,但之后您可以随时删除它们。
我正在尝试在 R 中重塑一些用户数据。我有 data.frame 个会话 ID。每个会话都有一个 User_ID 和日期。我想将 "User_ID" 变量用作我的 "Key",但仅用于具有 "userType" 或 "New Visitor" 的观察。因此,每个 "New Visitor" 将有一行。然后将每个后续会话 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)
相反,我想 return 这个:
userID sessionID1 date1 SessionID2 date2 SesionID3 date3
100105276 1452632119 2015-01-01 1452634303 2015-01-02 100105276 2015-01-02
如果有任何没有后续会话 ID 的用户 ID,将在变量缺失值的地方传递 "na" 值。我已经阅读了有关使用 tidyr 或 reshape2 来执行此操作的信息,但我无法让它们完全按照我的要求进行操作。
鉴于您的数据按 userID
和 sessionID
排序,并且每一行都是一个唯一的会话,您可以:
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
也作为变量包含在内,但之后您可以随时删除它们。