【问题标题】:Concise R data.table syntax for modal value (most frequent) by group按组显示模态值(最常见)的简明 R data.table 语法
【发布时间】:2015-12-21 19:31:57
【问题描述】:

什么是高效优雅的 data.table 语法来查找每个 id 的最常见类别?我保留一个指示 NA 位置的布尔向量(用于其他目的)

dt = data.table(id=rep(1:2,7), category=c("x","y",NA))
print(dt)

在这个玩具示例中,忽略 NA,xid==1 的常见类别,yid==2 的常见类别。

【问题讨论】:

    标签: r data.table frequency


    【解决方案1】:

    如果你想忽略NA的,你必须先用!is.na(category)排除它们,按idcategoryby = .(id, category))分组,然后用.N创建一个频率变量:

     dt[!is.na(category), .N, by = .(id, category)]
    

    给出:

       id category N
    1:  1        x 3
    2:  2        y 3
    3:  2        x 2
    4:  1        y 2
    

    通过id 订购此内容将使您的图片更清晰:

     dt[!is.na(category), .N, by = .(id, category)][order(id)]
    

    导致:

       id category N
    1:  1        x 3
    2:  1        y 2
    3:  2        y 3
    4:  2        x 2
    

    如果您只想要指示最佳结果的行:

    dt[!is.na(category), .N, by = .(id, category)][order(id, -N), head(.SD,1), by = id]
    

    或:

    dt[!is.na(category), .N, by = .(id, category)][, .SD[which.max(N)], by = id]
    

    两者都给出:

       id category N
    1:  1        x 3
    2:  2        y 3
    

    【讨论】:

    • 这有可能会丢弃只有 NA 的组,顺便说一句...可能会加入他们或在这种情况下 dt[!is.na(category)][, .N, by=.(id, category)][order(-N)][.(unique(dt$id)), on=.(id), .SD[1L], by=id] 或者只是将排序优先权给予非 NA:dt[, .N, by=.(id, category)][order(is.na(category), -N), .SD[1L], by=id]
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2013-07-12
    相关资源
    最近更新 更多