如何在 r 中的 data.table 链中排序?
How to order in chain in data.table in r?
我刚遇到 data.table 并第一次尝试对我现有的 dplyr
代码进行基准测试,看看它们在执行时间上是否有任何不同如果是,那么将开始学习 data.table
在data.table中尝试了一些代码,但无法复制 dplyr 结果。
library(tidyverse)
library(data.table)
df_ind_stacked_daily <- read.csv(url("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/df_ind_stacked_daily.csv")) %>%
mutate(Date = ymd(Date)) %>% data.table()
data.table 代码尝试:
df_ind_stacked_daily[Daily_cases_type == "Daily_confirmed" &
Date >= max(Date) - 6 & Date <= max(Date) &
State.UnionTerritory != "India",
by = Date] %>%
.[order(-Daily_cases_counts),
.SD[1],
by = Date]
dplyr代码:
df_ind_stacked_daily %>% as_tibble() %>%
filter(Daily_cases_type == "Daily_confirmed",
Date >= max(Date) - 6 & Date <= max(Date),
State.UnionTerritory != "India"
) %>%
group_by( Date) %>%
slice_max(order_by = Daily_cases_counts, n = 10) %>%
ungroup()
感谢任何帮助!!
这是data.table
翻译:
df_ind_stacked_daily[Daily_cases_type == "Daily_confirmed" &
Date >= max(Date) - 6 & Date <= max(Date) &
State.UnionTerritory != "India"
][order(Daily_cases_counts, decreasing = TRUE)
][, .SD[1:10], by = Date]
您的主要错误是错误地使用了 by
。它仅与 J
(第二个参数)一起使用才有意义。
PS。如果您将学习 data.table
,主要节省的时间将来自更简洁和(可以说)逻辑语法的人工时间。
演示data.table's capabilities, I have further streamlined and :
library(data.table)
fread("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/df_ind_stacked_daily.csv")[
Daily_cases_type == "Daily_confirmed" & Date >= max(Date) - 6 & State.UnionTerritory != "India"][
order(-Daily_cases_counts), head(.SD, 10L), by = Date]
- data.table的快速
fread()
用于直接从给定的URL. 读取数据
- 列
Date
在加载数据时被 fread()
自动强制为整数日期 class IDate
。不需要明确的转换步骤。
- 过滤条件
Date <= max(Date)
已删除,因为它满足所有日期。
order(Daily_cases_counts, decreasing = TRUE)
被替换为等效的
order(-Daily_cases_counts)
。注意减号表示
递减顺序。
- 排序和分组合并为一个表达式。
head(.SD, 10L)
用作 .SD[1:10]
的替代方法。
- data.table 链接 在整个过程中使用,因此删除变量
df_ind_stacked_daily
.
我刚遇到 data.table 并第一次尝试对我现有的 dplyr
代码进行基准测试,看看它们在执行时间上是否有任何不同如果是,那么将开始学习 data.table
在data.table中尝试了一些代码,但无法复制 dplyr 结果。
library(tidyverse)
library(data.table)
df_ind_stacked_daily <- read.csv(url("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/df_ind_stacked_daily.csv")) %>%
mutate(Date = ymd(Date)) %>% data.table()
data.table 代码尝试:
df_ind_stacked_daily[Daily_cases_type == "Daily_confirmed" &
Date >= max(Date) - 6 & Date <= max(Date) &
State.UnionTerritory != "India",
by = Date] %>%
.[order(-Daily_cases_counts),
.SD[1],
by = Date]
dplyr代码:
df_ind_stacked_daily %>% as_tibble() %>%
filter(Daily_cases_type == "Daily_confirmed",
Date >= max(Date) - 6 & Date <= max(Date),
State.UnionTerritory != "India"
) %>%
group_by( Date) %>%
slice_max(order_by = Daily_cases_counts, n = 10) %>%
ungroup()
感谢任何帮助!!
这是data.table
翻译:
df_ind_stacked_daily[Daily_cases_type == "Daily_confirmed" &
Date >= max(Date) - 6 & Date <= max(Date) &
State.UnionTerritory != "India"
][order(Daily_cases_counts, decreasing = TRUE)
][, .SD[1:10], by = Date]
您的主要错误是错误地使用了 by
。它仅与 J
(第二个参数)一起使用才有意义。
PS。如果您将学习 data.table
,主要节省的时间将来自更简洁和(可以说)逻辑语法的人工时间。
演示data.table's capabilities, I have further streamlined
library(data.table)
fread("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/df_ind_stacked_daily.csv")[
Daily_cases_type == "Daily_confirmed" & Date >= max(Date) - 6 & State.UnionTerritory != "India"][
order(-Daily_cases_counts), head(.SD, 10L), by = Date]
- data.table的快速
fread()
用于直接从给定的URL. 读取数据
- 列
Date
在加载数据时被fread()
自动强制为整数日期 classIDate
。不需要明确的转换步骤。 - 过滤条件
Date <= max(Date)
已删除,因为它满足所有日期。 order(Daily_cases_counts, decreasing = TRUE)
被替换为等效的
order(-Daily_cases_counts)
。注意减号表示 递减顺序。- 排序和分组合并为一个表达式。
head(.SD, 10L)
用作.SD[1:10]
的替代方法。- data.table 链接 在整个过程中使用,因此删除变量
df_ind_stacked_daily
.