【问题标题】:Data table - apply the same function on several columns to create new data table columns数据表 - 对多个列应用相同的函数来创建新的数据表列
【发布时间】:2017-02-14 05:43:20
【问题描述】:

我正在使用 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 上应用此功能的试验都会导致与我计划的不同...最好的方法是什么?我使用 !="" 以避免出现空白单元格。

【问题讨论】:

  • 我猜你需要的是dt[, lapply(.SD, function(x) x[nzchar(x)][1]), by = VisitID, .SDcols = 3:5]
  • 谢谢!完美运行!

标签: r user-defined-functions aggregation lapply


【解决方案1】:

我们在.SDcols 中指定感兴趣的列,按“VisitID”分组,遍历.SDcols (lapply(.SD, ...) 中的列并获取第一个非空白元素

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2017-03-18
    • 2015-04-21
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多