数据 table - 在多个列上应用相同的函数以创建新的数据 table 列
Data table - apply the same function on several columns to create new data table columns
我正在使用 data.table 包。我有一个数据 table 代表用户在网站上的操作。假设每个用户都可以访问一个网站,并对其执行多项操作。我的原始数据 table 是操作(每一行都是一个操作),我想将这些信息聚合到一个新数据 table 中,按用户访问分组(每次访问都有一个唯一的 ID)。同一次访问的操作共享一些字段 - 例如 - 用户名、用户状态、访问次数等。每次访问的至少一个操作包含此信息(不一定是所有操作).我想为每次访问(= 具有相同访问 ID 的操作组)检索此字段的值,并将其设置为访问新数据 table 中的访问。比如我有如下原始数据table:
VisitID ActionNum UserName UserStatus VisitNum ActionType
aaaaaaa 1 John Active 5 x
aaaaaaa 2 Active y
aaaaaaa 3 John 5 z
bbbbbbb 1 NonActive w
bbbbbbb 2 Dan 7 t
我想要一个访问数据table,如下:
VisitID UserName UserStatus VisitNum
aaaaaaa John Active 5
bbbbbbb Dan NonActive 7
我创建了一个函数,用于处理数据子集 table(仅访问的行)和一个字段,该函数应应用于多个字段(UserName、UserStatus、VisitNum)。
getGeneralField<- function(visitDT,field){
vec = visitDT[,get(field)]
return (unique(vec[vec != ""])[1])
}
问题是,每次尝试在 .SD 上应用此功能时,by=VisitID 都会导致与我计划不同的结果...最好的方法是什么?我使用 !="" 以避免空白单元格。
我们在 .SDcols
中指定感兴趣的列,按 'VisitID' 分组,遍历 .SDcols
(lapply(.SD, ...
) 中的列并获得第一个非空白元素
dt[, lapply(.SD, function(x) x[nzchar(x)][1]), by = VisitID, .SDcols = 3:5]
我正在使用 data.table 包。我有一个数据 table 代表用户在网站上的操作。假设每个用户都可以访问一个网站,并对其执行多项操作。我的原始数据 table 是操作(每一行都是一个操作),我想将这些信息聚合到一个新数据 table 中,按用户访问分组(每次访问都有一个唯一的 ID)。同一次访问的操作共享一些字段 - 例如 - 用户名、用户状态、访问次数等。每次访问的至少一个操作包含此信息(不一定是所有操作).我想为每次访问(= 具有相同访问 ID 的操作组)检索此字段的值,并将其设置为访问新数据 table 中的访问。比如我有如下原始数据table:
VisitID ActionNum UserName UserStatus VisitNum ActionType
aaaaaaa 1 John Active 5 x
aaaaaaa 2 Active y
aaaaaaa 3 John 5 z
bbbbbbb 1 NonActive w
bbbbbbb 2 Dan 7 t
我想要一个访问数据table,如下:
VisitID UserName UserStatus VisitNum
aaaaaaa John Active 5
bbbbbbb Dan NonActive 7
我创建了一个函数,用于处理数据子集 table(仅访问的行)和一个字段,该函数应应用于多个字段(UserName、UserStatus、VisitNum)。
getGeneralField<- function(visitDT,field){
vec = visitDT[,get(field)]
return (unique(vec[vec != ""])[1])
}
问题是,每次尝试在 .SD 上应用此功能时,by=VisitID 都会导致与我计划不同的结果...最好的方法是什么?我使用 !="" 以避免空白单元格。
我们在 .SDcols
中指定感兴趣的列,按 'VisitID' 分组,遍历 .SDcols
(lapply(.SD, ...
) 中的列并获得第一个非空白元素
dt[, lapply(.SD, function(x) x[nzchar(x)][1]), by = VisitID, .SDcols = 3:5]