如何在 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,主要节省的时间将来自更简洁和(可以说)逻辑语法的人工时间。

演示'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]
  1. data.table的快速fread()用于直接从给定的URL.
  2. 读取数据
  3. Date 在加载数据时被 fread() 自动强制为整数日期 class IDate。不需要明确的转换步骤。
  4. 过滤条件 Date <= max(Date) 已删除,因为它满足所有日期。
  5. order(Daily_cases_counts, decreasing = TRUE) 被替换为等效的
    order(-Daily_cases_counts)。注意减号表示 递减顺序。
  6. 排序和分组合并为一个表达式。
  7. head(.SD, 10L) 用作 .SD[1:10] 的替代方法。
  8. data.table 链接 在整个过程中使用,因此删除变量 df_ind_stacked_daily.