Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Don';t数据表行_R_Data.table - Fatal编程技术网

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秒。谢谢你的帮助。