【问题标题】:Count distinct over multiple columns in data.table对 data.table 中的多列进行不同计数
【发布时间】:2026-01-07 14:45:02
【问题描述】:

我在不同的times 和不同的situations 观察到users,我可能会多次看到它们,如下所示:

df <- data.table(time = c(1,1,1,2,2),
                 user = c(1,1,2,1,2),
                 situation = c(1,1,1,2,2),
                 observation = c(1,2,1,1,1))

我想做的是使用data.table计算每个时间段内user-situations的数量。预期输出:

result <- data.table(time = c(1,2),
                     user_situations = c(2,2))

我知道我可以通过连锁方式做到这一点:

 unique(df[, .(time, user, situation)])[, .(user_situations = .N), .(time)]

但想知道是否有一种简单的方法可以一次性完成。

【问题讨论】:

  • 您可以尝试df[, .(user_situations = uniqueN(.SD[,.(user, situation)])), time],但我认为您的方法更有效。
  • 你的解决方案对我来说很好,我会稍微修改为unique(df, by = c("user","situation"))[, .N, by = time]
  • @DavidArenburg 想把它作为答案发布吗?

标签: r count data.table


【解决方案1】:

dplyr解决方案:

library(dplyr)
df <- data.table(time = c(1,1,1,2,2),
             user = c(1,1,2,1,2),
             situation = c(1,1,1,2,2),
             observation = c(1,2,1,1,1))

df %>% group_by(time) %>%
  distinct(user, situation) %>%
  summarise(user_situations = n())

# tbl_dt [2 × 2]
   time user_situation
  <dbl>          <int>
1     1              2
2     2              2

【讨论】:

  • 是的,在dplyr 这个东西很简单。不幸的是,我需要一个data.table
  • 这比data.table 解决方案更容易吗?这只是简单的口头表达
  • 我想补充一点,这个summarise(n_distinct(c(user, situation))) - 我认为它会起作用 - 没有给出正确的结果。谢谢你的解决方案!
最近更新 更多