【发布时间】:2016-10-10 17:08:04
【问题描述】:
这是一个规模更大的问题的非常简化的版本。
目标是使用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
但是当我尝试在脚本中的不同位置使用 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
显然,对于这个简单的任务还有其他更容易理解的脚本,但我想了解为什么会出现这个问题。
【问题讨论】:
-
这两个
dt变量没有定义同一个数据框。如果我使用一个,我会得到一致的结果。
标签: r data.table dplyr