【问题标题】:data.table alternative to pipingdata.table 替代管道
【发布时间】:2019-01-13 10:48:46
【问题描述】:

我目前正在学习非常强大和高效的 data.table 框架(包)。然而,我似乎无法弄清楚如何做这样的事情。 我要做的是按多列(制造商和运营商)分组,根据此分组获取航班数量,然后按降序排列这些,然后是前 10 名制造商和运营商的 ggplot。 我会在 tidyverse 中这样做:

library(nycflights13)
library(tidyverse)
flights %>% 
  left_join(planes, by = "tailnum") %>% 
  group_by(manufacturer, carrier) %>% 
  summarise(N = n()) %>% 
  arrange(desc(N)) %>% 
  top_n(10, N) %>% 
  ggplot(aes(carrier, N, fill = manufacturer)) + geom_col() + guides(fill = FALSE)

这是我尝试过的:(我将问题留了几分钟尝试解决但失败了)

library(data.table)
fly<-copy(nycflights13::flights)
setDT(fly)
setkey(fly,tailnum)
planes1 <- copy(planes)
setDT(planes1)
setkey(planes1, tailnum)
#head(planes1,2)
Merged <- merge(fly, planes1, by = "tailnum")
#Group by manufacturer
Merged[, .N, by = .(manufacturer,carrier)] #[, order(manufacturer, carrier)]

问题是我无法返回有序数据,也不知道如何在不先将有序合并保存为对象的情况下“链接”到 ggplot。

【问题讨论】:

  • Code Review 上的运气会更好吗?
  • @Henrik 已编辑。如果我需要说得更清楚,请告诉我。
  • @Roman 谢谢。我会在几个小时内看看是否有人提供帮助。如果没有,我会在继续尝试自己的同时尝试 Code Review。

标签: r ggplot2 data.table


【解决方案1】:

您可以使用方括号[] 中的内容链接在一起。此外,您可以在 语法的j 部分内执行ggplot 调用:

nms <- setdiff(names(planes1), "tailnum")

fly[planes1, on = .(tailnum), (nms) := mget(nms)
    ][, .N, by = .(manufacturer,carrier)
      ][order(-N)
        ][, .SD[1:10], by = .(manufacturer,carrier)
          ][, ggplot(.SD, aes(carrier, N, fill = manufacturer)) +
              geom_col() +
              guides(fill = FALSE)]

给出:

【讨论】:

  • 这里只是一个注释。上面的图形不能用上面的裸代码重现。最好确保提供的代码是完全可重现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2011-01-02
相关资源
最近更新 更多