首页 > 解决方案 > 如何在 data.table 中链接 group_by、filter、distinct、count?

问题描述

我对data.table有点陌生,并试图将我的dplyr代码复制到data.table但无法获得相同的结果。

library(data.table)
library(lubridate)
library(tidyverse)

df

(在这个虚拟数据中没有使用任何 NA,但需要过滤掉 NA)

test_df <- data.frame(id = c(1234, 1234, 5678, 5678),
           date = c("2021-10-10","2021-10-10", "2021-8-10", "2021-8-15")) %>% 
  
  mutate(date = ymd(date))

dplyr 代码:

找出具有多个不同日期的 ID。

test_df %>%
  group_by(id) %>%
  filter(!is.na(date)) %>% 
  distinct(date) %>% 
  count(id) %>% 
  filter(n > 1)
id      n

5678    2   

数据表尝试:

test_dt <- setDT(test_df)

test_dt[!is.na(date), by = id][
    ,keyby = .(date)][
      ,.N, by = id][
        N > 1
        ]

标签: rdata.table

解决方案


distinctin dplyrcan uniquein data.tablewithby选项_

unique(setDT(test_df)[!is.na(date)], by = c("id", "date"))[, .N, by = id][N > 1]
     id N
1: 5678 2

步骤如下

  1. 转换为 data.table ( setDT)
  2. 删除带有NAfrom 'date' ( !is.na(date))的行
  3. 获取'id' 和 'date' 列的uniqueby
  4. 按 'id' 分组以获取计数 ( .N)
  5. 最后过滤count大于1的行

推荐阅读