一对多在 R 中使用 ffbase
One-to-many using ffbase in R
我想使用 ffdf
复制以下一对多连接。最好的方法是什么?
下面我展示了一个我想要使用 data.tables 得到的例子。我知道 merge.ffdf 函数的以下描述:
"This method is similar to merge in the base package but only allows inner and left outer joins. Note that joining is done based on ffmatch or ffdfmatch: only the first element in y will be added to x".
但是,我想知道是否有办法解决这个问题。
> A <- data.table(col1 = LETTERS[1:3],col2 = c("john",'harry','potter'))
> A
col1 col2
1: A john
2: B harry
3: C potter
> B
col1 col2
1: A 1
2: A 2
3: A 3
4: B 4
5: B 5
6: B 6
7: C 7
8: C 8
9: C 9
> merge(A,B,by = 'col1',all.x = T)
col1 col2.x col2.y
1: A john 1
2: A john 2
3: A john 3
4: B harry 4
5: B harry 5
6: B harry 6
7: C potter 7
8: C potter 8
9: C potter 9
现在使用 ffdf:
> C <- as.ffdf(as.data.frame(unclass(A)))
> D <- as.ffdf(as.data.frame(unclass(B)))
> merge.ffdf(C,D,by = 'col1', all.x = T)
ffdf (all open) dim=c(3,3), dimorder=c(1,2) row.names=NULL
ffdf virtual mapping
PhysicalName VirtualVmode PhysicalVmode AsIs VirtualIsMatrix PhysicalIsMatrix
col1 col1 integer integer FALSE FALSE FALSE
col2.x col2 integer integer FALSE FALSE FALSE
col2.y col2.y double double FALSE FALSE FALSE
PhysicalElementNo PhysicalFirstCol PhysicalLastCol PhysicalIsOpen
col1 1 1 1 TRUE
col2.x 2 1 1 TRUE
col2.y 3 1 1 TRUE
ffdf data
col1 col2.x col2.y
1 A john 1
2 B harry 4
3 C potter 7
>
请注意,使用 ffdf 的结果仅包含每个组的第一个元素。有什么方法可以得到剩下的?
merge.ffdf(D,C,by = 'col1', all.x=T)
根据文档,merge.ffdf 只允许内部连接(所有匹配的键)或左连接(所有 "left" 键)。
我想它会将每一整行都视为一个键,并丢弃重复项。
我想使用 ffdf
复制以下一对多连接。最好的方法是什么?
下面我展示了一个我想要使用 data.tables 得到的例子。我知道 merge.ffdf 函数的以下描述:
"This method is similar to merge in the base package but only allows inner and left outer joins. Note that joining is done based on ffmatch or ffdfmatch: only the first element in y will be added to x".
但是,我想知道是否有办法解决这个问题。
> A <- data.table(col1 = LETTERS[1:3],col2 = c("john",'harry','potter'))
> A
col1 col2
1: A john
2: B harry
3: C potter
> B
col1 col2
1: A 1
2: A 2
3: A 3
4: B 4
5: B 5
6: B 6
7: C 7
8: C 8
9: C 9
> merge(A,B,by = 'col1',all.x = T)
col1 col2.x col2.y
1: A john 1
2: A john 2
3: A john 3
4: B harry 4
5: B harry 5
6: B harry 6
7: C potter 7
8: C potter 8
9: C potter 9
现在使用 ffdf:
> C <- as.ffdf(as.data.frame(unclass(A)))
> D <- as.ffdf(as.data.frame(unclass(B)))
> merge.ffdf(C,D,by = 'col1', all.x = T)
ffdf (all open) dim=c(3,3), dimorder=c(1,2) row.names=NULL
ffdf virtual mapping
PhysicalName VirtualVmode PhysicalVmode AsIs VirtualIsMatrix PhysicalIsMatrix
col1 col1 integer integer FALSE FALSE FALSE
col2.x col2 integer integer FALSE FALSE FALSE
col2.y col2.y double double FALSE FALSE FALSE
PhysicalElementNo PhysicalFirstCol PhysicalLastCol PhysicalIsOpen
col1 1 1 1 TRUE
col2.x 2 1 1 TRUE
col2.y 3 1 1 TRUE
ffdf data
col1 col2.x col2.y
1 A john 1
2 B harry 4
3 C potter 7
>
请注意,使用 ffdf 的结果仅包含每个组的第一个元素。有什么方法可以得到剩下的?
merge.ffdf(D,C,by = 'col1', all.x=T)
根据文档,merge.ffdf 只允许内部连接(所有匹配的键)或左连接(所有 "left" 键)。
我想它会将每一整行都视为一个键,并丢弃重复项。