Ant*_*osK 3 r dplyr data.table
这是一个更大规模的问题的简化版本.目标是使用data.table
结构和dplyr
命令更快地对多列进行排序和分组.
正确的版本如下:
library(dplyr)
library(data.table)
library(dtplyr)
library(lubridate)
# data set
dt = data.frame(id = c("a","b", "a"),
date = ymd(c("2016-01-03","2016-01-02","2016-01-01")),
value = c(10,5,9), stringsAsFactors = F)
# process to get the id of the largest value
(setDT(dt, key=c("id","value")) %>% select(id,value) %>% arrange(desc(value)) %>% slice(1))$id -> picked_id
# return all rows of this id
dt %>% filter(id %in% picked_id)
# id date value
# 1: a 2016-01-01 9
# 2: a 2016-01-03 10
Run Code Online (Sandbox Code Playgroud)
但是当我尝试setDT
在我的脚本中使用不同的位置时,我得到了不同的结果:
dt = data.frame(id = c("a","b", "a"),
date = ymd(c("2016-01-03","2016-01-02","2016-01-01")),
value = c(10,5,9), stringsAsFactors = F)
(dt %>% select(id,value) %>% setDT(., key=c("id","value")) %>% arrange(desc(value)) %>% slice(1))$id -> picked_id
dt %>% filter(id %in% picked_id)
# id date value
# 1 a 2016-01-03 9
# 2 a 2016-01-02 10
Run Code Online (Sandbox Code Playgroud)
显然,对于这个简单的任务,还有其他更容易理解的脚本,但我想了解为什么会出现此问题.
您不能安全地混合(i)data.table的函数,这些函数通过引用修改为(ii)dplyr链,其设计为永远不会通过引用进行修改.看看这里发生了什么:
library(dplyr)
library(data.table)
library(dtplyr)
library(lubridate)
dt = data.frame(id = c("a","b", "a"),
date = ymd(c("2016-01-03","2016-01-02","2016-01-01")),
value = c(10,5,9), stringsAsFactors = FALSE)
dt
id date value
1 a 2016-01-03 10
2 b 2016-01-02 5
3 a 2016-01-01 9
dt %>% select(id,value) %>% setDT(., key=c("id","value"))
dt
id date value
1 a 2016-01-03 9
2 a 2016-01-02 10
3 b 2016-01-01 5
Run Code Online (Sandbox Code Playgroud)
因此select
ed列已被setDT
调用修改.您可以将此视为dtplyr执行中的错误select
或OP的滥用.无论如何,我会一次坚持使用一个范例(就个人而言,我只是使用带有magrittr的data.table而且从未遇到过这些问题).现在,您可以添加一个copy
链,
dt %>% select(id,value) %>% copy %>% setDT(., key=c("id","value"))
Run Code Online (Sandbox Code Playgroud)
但我想你需要在整个地方做到这一点.
归档时间: |
|
查看次数: |
376 次 |
最近记录: |