R Don';t数据表行
我正在学习R Don';t数据表行,r,data.table,R,Data.table,我正在学习data.table,所以我对它的语法非常陌生。我尝试将包用作散列查找,它工作得很好,但由于我对语法的无知,它会对行进行重新排序。我希望它不要在不牺牲速度的情况下对行进行重新排序(即,实现这一点的有效方法)。以下是一个示例和所需的输出: library(data.table) (key <- setNames(aggregate(mpg~as.character(carb), mtcars, mean), c("x", "y"))) set.seed(10) terms <
data.table
,所以我对它的语法非常陌生。我尝试将包用作散列查找,它工作得很好,但由于我对语法的无知,它会对行进行重新排序。我希望它不要在不牺牲速度的情况下对行进行重新排序(即,实现这一点的有效方法)。以下是一个示例和所需的输出:
library(data.table)
(key <- setNames(aggregate(mpg~as.character(carb), mtcars, mean), c("x", "y")))
set.seed(10)
terms <- data.frame(x = c(9, 12, sample(key[, 1], 6, TRUE)), stringsAsFactors = FALSE)
## > terms$x
## [1] "9" "12" "4" "2" "3" "6" "1" "2"
setDT(key)
setDT(terms)
setkey(key, x)
setkey(terms, x)
terms[key, out := i.y]
terms
我想:
## x out
## 1: 9 NA
## 2: 12 NA
## 3: 4 15.79000
## 4: 2 22.40000
## 5: 3 16.30000
## 6: 6 19.70000
## 7: 1 25.34286
## 8: 2 22.40000
在data.table
中,联接x[i]
必须为x
设置一个键,但不一定要为i
设置键
注意:但是如果您没有为i
设置键
- 1) 确保
的列与i
的键列顺序相同(如有必要,请使用x
重新排序),因为它不会通过检查名称(尚未)进行连接setcolorder
- 2) 它可能会慢一点(但在我的基准测试中不会慢很多)
x[i]
联接而不进行任何额外的预处理,那么术语
必须取代i
,而不设置任何键,以便按照您需要的顺序获得结果
考虑到这一点,我们可以用两种方法(我可以想到)
第一种方法: 这个不需要额外的预处理。也就是说,如上所述,我们将
key
视为x
,这意味着必须设置它的键。我们不为术语设置键
setkey(key, x)
terms
的第一列也被命名为x
,这就是我们想要加入的列。因此,这里不需要重新排序
ans = key[terms]
> ans
# x y
# 1: 9 NA
# 2: 12 NA
# 3: 4 15.79000
# 4: 2 22.40000
# 5: 3 16.30000
# 6: 6 19.70000
# 7: 1 25.34286
# 8: 2 22.40000
不同之处在于,这是一个全新的data.table,而不仅仅是通过引用分配列
第二种方法:
我们做了一点额外的预处理-通过引用将额外的列N
添加到terms
,该列从1:nrow(terms)
运行。这基本上可以帮助我们在连接之后按照所需的顺序重新排列数据。这里,我们将考虑<代码>术语<代码> >代码> x<代码>
terms[, N := 1:.N]
setkey(terms, x)
setkey(key, x)
setkey(terms[key, out := i.y], N)
> terms
# x N out
# 1: 9 1 NA
# 2: 12 2 NA
# 3: 4 3 15.79000
# 4: 2 4 22.40000
# 5: 3 5 16.30000
# 6: 6 6 19.70000
# 7: 1 7 25.34286
# 8: 2 8 22.40000
key
是否将“x”列设置为key并不重要。。但是,如果未设置键,请再次确保x
是key
中的第一列。。在本例中,我将把key
的key列设置为x
terms[, N := 1:.N]
setkey(terms, x)
setkey(key, x)
setkey(terms[key, out := i.y], N)
> terms
# x N out
# 1: 9 1 NA
# 2: 12 2 NA
# 3: 4 3 15.79000
# 4: 2 4 22.40000
# 5: 3 5 16.30000
# 6: 6 6 19.70000
# 7: 1 7 25.34286
# 8: 2 8 22.40000
就个人而言,由于您需要未排序的术语
,因此我在这里使用第一种方法。但是,可以根据您的实际数据维度进行基准测试,并选择最适合您的需求。我使用了第一个w/o benching b/c,它很简单,在1000万个术语中,使用26个关键值时<1秒。谢谢你的帮助。