将dplyr转换为data.table

时间:2019-07-13 23:10:30

标签: r dplyr data.table dtplyr

因此,我正在尝试翻译一些dplyr代码。我试图从将dplyr转换为data.table的程序包中获得帮助,但仍然无法正常工作。错误来自row_number的{​​{1}}。

我需要dplyr代码中的所有步骤(即使在dplyr中没有意义)

mtcars

reprex package(v0.3.0)于2019-07-14创建

4 个答案:

答案 0 :(得分:6)

我可能会推荐rowid函数吗?它完成了“隐藏”的分组步骤,您可能会发现它看起来更干净:

unique(DT, by='mpg')[order(am, mpg), row_num := LETTERS[rowid(am)]]

如果您喜欢链接,还可以将所有内容放入[]

DT[ , .SD[1L], by = mpg
   ][order(am, mpg), row_num := LETTERS[rowid(am)]]

答案 1 :(得分:2)

我们可以使用seq_len(.N)

unique(DT, by = "mpg")[order(am, mpg)][, 
     `:=`(row_num = LETTERS[seq_len(.N)]), by = .(am)][]

答案 2 :(得分:1)

由于data.table语法被严重批评,下面是akrun答案的两个版本,恕我直言,语法更清晰。

data.table多次与[进行管道传输时,尤其是在有:=调用(dplyr中的mutate)的情况下,我很难遵循library(data.table) dt = as.data.table(mtcars) dt = unique(dt, by = "mpg") dt = dt[order(am, mpg)] dt[, row_num:=LETTERS[seq_len(.N)], by=am] dt[1:3] mpg cyl disp hp drat wt qsec vs am gear carb row_num 1: 10.4 8 472 205 2.93 5.25 17.98 0 0 3 4 A 2: 13.3 8 350 245 3.73 3.84 15.41 0 0 3 4 B 3: 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4 C 的代码。

%>%

另一个选择是使用library(magrittr) dt = as.data.table(mtcars) dt = unique(dt, by = "mpg") %>% .[order(am, mpg)] %>% .[, row_num:=LETTERS[seq_len(.N)], by=am] dt[1:3] # mpg cyl disp hp drat wt qsec vs am gear carb row_num # 1: 10.4 8 472 205 2.93 5.25 17.98 0 0 3 4 A # 2: 13.3 8 350 245 3.73 3.84 15.41 0 0 3 4 B # 3: 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4 C 管道。

parseQueryString()

答案 3 :(得分:0)

我正在尝试对翻译进行一些调整,以便dtplyr会自动生成更像您想要的内容:

library(dtplyr)
library(dplyr, warn.conflicts = FALSE)

dt <- lazy_dt(mtcars)

dt %>% 
  distinct(mpg, .keep_all = TRUE) %>% 
  group_by(am) %>% 
  arrange(mpg, .by_group = TRUE) %>% 
  mutate(row_num = LETTERS[row_number()]) %>% 
  ungroup() %>% 
  show_query()
#> unique(`_DT1`, by = "mpg")[order(am, mpg)][, `:=`(row_num = ..LETTERS[seq_len(.N)]), 
#>    keyby = .(am)]

或者避免按照@MichaelChirico的建议进行分组:

dt %>% 
  distinct(mpg, .keep_all = TRUE) %>% 
  arrange(am, mpg) %>% 
  mutate(row_num = LETTERS[row_number(am)]) %>% 
  ungroup() %>% 
  show_query()
#> unique(`_DT1`, by = "mpg")[order(am, mpg)][, `:=`(row_num =  ..LETTERS[frank(am, 
#>    ties.method = "first", na.last = "keep")])]

(使用..前面的LETTERS是data.table功能,它可以清楚地表明您所引用的是数据框之外的变量;这里可能没有必要,但是我认为安全胜于后悔。)