数据表 - 在多个列上应用相同的函数以创建新的数据表列

时间:2016-10-05 16:54:04

标签: r user-defined-functions aggregation lapply

我正在使用data.table包。我有一个表示用户在网站上的操作的数据表。让我们说每个用户都可以访问一个网站,并对其进行多项操作。我的原始数据表是操作(每一行都是一个操作),我想将这些信息聚合到一个新的数据表中,按用户访问分组(每次访问都有一个唯一的ID)。有一些字段由同一访问的操作共享 - 例如 - 用户名,用户状态,访问号等。每次访问的至少一个操作包含此信息(不一定是所有操作) )。我想检索每次访问(=具有相同访问ID的操作组),此字段的值,并将其设置为访问新数据表中的访问。例如,如果我有以下原始数据表:

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

我想要一个访问数据表,如下所示:

VisitID  UserName   UserStatus   VisitNum
aaaaaaa   John       Active        5
bbbbbbb   Dan        NonActive     7

我创建了一个适用于数据表子集(仅访问行)和字段的函数,该函数应该应用于多个字段(UserName,UserStatus,VisitNum)。

getGeneralField<- function(visitDT,field){
  vec = visitDT[,get(field)]
  return (unique(vec[vec != ""])[1])
}

问题是,当by = VisitID时,每次在.SD上应用此功能的试验都会产生与我计划不同的东西......最好的方法是什么?我用了!=&#34;&#34;为了避免空白细胞。

1 个答案:

答案 0 :(得分:4)

我们在.SDcols中指定感兴趣的列,按&#39; VisitID&#39;分组,循环浏览.SDcolslapply(.SD, ...)中的列并获得第一个非空白元素

dt[, lapply(.SD, function(x) x[nzchar(x)][1]), by = VisitID, .SDcols = 3:5]