gpt4 book ai didi

r - 使用 data.table 存储为列表元素的多个数据帧的完全外部连接

转载 作者:行者123 更新时间:2023-12-04 10:56:09 25 4
gpt4 key购买 nike

我正在尝试使用 data.table 对存储为列表元素的多个数据帧进行完全外部联接。我已经使用 reshape 包的 merge_recurse() 函数成功地做到了这一点,但是对于较大的数据集来说它非常慢,我想通过使用数据表。我不确定 data.table 处理具有多个数据帧的列表结构的最佳方式。我也不确定我是否在唯一键上正确编写了 Reduce() 函数以在多个数据帧上进行完全外部连接。

这是一个小例子:

#Libraries
library("reshape")
library("data.table")

#Specify list of multiple dataframes
filelist <- list(data.frame(x=c(1,1,1,2,2,2,3,3,3), y=c(1,2,3,1,2,3,1,2,3), a=1:9),
data.frame(x=c(1,1,1,2,2,2,3,3,4), y=c(1,2,3,1,2,3,1,2,1), b=seq(from=0, by=5, length.out=9)),
data.frame(x=c(1,1,1,2,2,2,3,3,4), y=c(1,2,3,1,2,3,1,2,2), c=seq(from=0, by=10, length.out=9)))

#Merge with merge_recurse()
listMerged <- merge_recurse(filelist, by=c("x","y"))

#Attempt with data.table
ids <- lapply(filelist, function(x) x[,c("x","y")])
unique_keys <- unique(do.call("rbind", ids))
dt <- data.table(filelist)
setkey(dt, c("x","y")) #error here

Reduce(function(x, y) x[y[J(unique_keys)]], filelist)

这是我的预期输出:

> listMerged
x y a b c
1 1 1 1 0 0
2 1 2 2 5 10
3 1 3 3 10 20
4 2 1 4 15 30
5 2 2 5 20 40
6 2 3 6 25 50
7 3 1 7 30 60
8 3 2 8 35 70
9 3 3 9 NA NA
10 4 1 NA 40 NA
11 4 2 NA NA 80

这是我的资源:

最佳答案

这对我有用:

library("reshape")
library("data.table")
##
filelist <- list(
data.frame(
x=c(1,1,1,2,2,2,3,3,3),
y=c(1,2,3,1,2,3,1,2,3),
a=1:9),
data.frame(
x=c(1,1,1,2,2,2,3,3,4),
y=c(1,2,3,1,2,3,1,2,1),
b=seq(from=0, by=5, length.out=9)),
data.frame(
x=c(1,1,1,2,2,2,3,3,4),
y=c(1,2,3,1,2,3,1,2,2),
c=seq(from=0, by=10, length.out=9)))
##
## I used copy so that this would
## not modify 'filelist'
dtList <- copy(filelist)
lapply(dtList,setDT)
lapply(dtList,function(x){
setkeyv(x,cols=c("x","y"))
})
##
> Reduce(function(x,y){
merge(x,y,all=T,allow.cartesian=T)
},dtList)
x y a b c
1: 1 1 1 0 0
2: 1 2 2 5 10
3: 1 3 3 10 20
4: 2 1 4 15 30
5: 2 2 5 20 40
6: 2 3 6 25 50
7: 3 1 7 30 60
8: 3 2 8 35 70
9: 3 3 9 NA NA
10: 4 1 NA 40 NA
11: 4 2 NA NA 80

我还注意到您的代码中存在一些问题。 dt <- data.table(filelist)结果

> dt
filelist
1: <data.frame>
2: <data.frame>
3: <data.frame>

这很可能是 setkey(dt, c("x","y")) 中错误的原因你在上面指出的。另外,这对你有用吗?

Reduce(function(x, y) x[y[J(unique_keys)]], filelist)

我只是好奇,因为当我尝试运行它时出现错误(使用 dtList 而不是 filelist )

Error in eval(expr, envir, enclos) : could not find function "J"

我认为这与自 data.table 的 1.8.8 版以来实现的更改有关,@Arun 在 this answer 中解释.

关于r - 使用 data.table 存储为列表元素的多个数据帧的完全外部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26680580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com