如何链接 group_by、过滤、区分、计数 data.table?
How to chain group_by, filter, distinct, count in data.table?
我对 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
data.table 尝试:
test_dt <- setDT(test_df)
test_dt[!is.na(date), by = id][
,keyby = .(date)][
,.N, by = id][
N > 1
]
dplyr
中的distinct
可以是data.table
中的unique
加上by
选项
unique(setDT(test_df)[!is.na(date)], by = c("id", "date"))[, .N, by = id][N > 1]
id N
1: 5678 2
步骤如下
- 转换为 data.table (
setDT
)
- 从 'date' 中删除带有
NA
的行 (!is.na(date)
)
- 获取
unique
行 by
'id' 和 'date' 列
- 按 'id' 分组以获得计数 (
.N
)
- 最后过滤count大于1的行
我对 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
data.table 尝试:
test_dt <- setDT(test_df)
test_dt[!is.na(date), by = id][
,keyby = .(date)][
,.N, by = id][
N > 1
]
dplyr
中的distinct
可以是data.table
中的unique
加上by
选项
unique(setDT(test_df)[!is.na(date)], by = c("id", "date"))[, .N, by = id][N > 1]
id N
1: 5678 2
步骤如下
- 转换为 data.table (
setDT
) - 从 'date' 中删除带有
NA
的行 (!is.na(date)
) - 获取
unique
行by
'id' 和 'date' 列 - 按 'id' 分组以获得计数 (
.N
) - 最后过滤count大于1的行