【问题标题】:How to order in chain in data.table in r?如何在 r 中的 data.table 中按链排序?
【发布时间】:2021-08-20 09:31:34
【问题描述】:

我刚刚遇到 data.table 并第一次尝试对我现有的 dplyr 代码进行基准测试,看看它们在执行时间上是否有任何差异,如果有,那么将开始学习 @987654322 @

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() 

感谢任何帮助!

【问题讨论】:

  • 对于未来的问题,请学习如何创建最小的、独立的示例。
  • @Henrik,当然会记住这一点。谢谢!!

标签: r data.table


【解决方案1】:

为了展示的能力,我进一步精简了OP's codesindri's answer

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. 在加载数据时,fread() 会自动将列 Date 强制转换为整数日期类 IDate。不需要明确的转换步骤。
  3. 过滤条件 Date &lt;= max(Date) 已被删除,因为它在所有日期都满足。
  4. order(Daily_cases_counts, decreasing = TRUE) 被其等效
    order(-Daily_cases_counts) 替换。注意减号表示 降序。
  5. 排序和分组合并为一个表达式。
  6. head(.SD, 10L) 用作.SD[1:10] 的替代品。
  7. data.table 链接 在整个过程中都会使用,从而删除变量 df_ind_stacked_daily

【讨论】:

  • 感谢@Uwe 分享这个高度优化的代码。非常感谢您将所有解释与代码一起提供的努力。
【解决方案2】:

这是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,主要的时间节省将来自更简洁和(可以说)合乎逻辑的语法。

【讨论】:

  • 谢谢@sindri_baldur,。我想我可能可以使用data.table 加速shiny 应用程序中的一些数据处理,特别是如果数据集变大,但在您发表评论后,我会再考虑或可能会使用更大的数据集进行测试。再次感谢,感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多