3

我对 R 很陌生,并且对使用变量之一的范围值在两个数据帧之间进行子集和重组有疑问。所以我有两个这样的数据框:

        x         y                         
 [1,] 79.00     19.63
 [2,] 79.01     19.58
 [3,] 79.02     19.57
 [4,] 79.03     19.58
 [5,] 79.04     19.60
 [6,] 79.05     19.65
 [7,] 79.06     19.67
 [8,] 79.07     19.70
 [9,] 79.08     19.67
[10,] 79.09     19.72

          id        min_x  max_x
[1,] 7G005-1010-10  79.01  79.06  
[2,] 7G100-0001-10  79.02  79.09
[3,] 8S010-1201-10  79.06  79.09

我的目的是将它们两者结合起来,如下所示:

     id           x       y
7G005-1010-10   79,01   19,58
7G005-1010-10   79,02   19,57
7G005-1010-10   79,03   19,58
7G005-1010-10   79,04   19,6
7G005-1010-10   79,05   19,65
7G005-1010-10   79,06   19,7
7G100-0001-10   79,02   19,57
     ...         ...     ...

正如您在我的数据帧的输出中看到的那样,我尝试使用该data.table包来找到解决我的问题的方法。

好吧,如果有人能告诉我如何处理它(有或没有data.table)!

先感谢您。

对不起英语不好。

4

1 回答 1

4

这是不可能的data.table。实施是FR#203。你可以试试 packagexts因为我认为它有这个操作。

一种漫长而笨重的方式(未经测试)data.table如下。假设您的第一个表是P,包含范围的第二个表是R

setkey(P,x)
# sort by x and mark as sorted so future queries can use binary search on P

from = P[J(R$min_x),which=TRUE]
# Lookup each min_x in the key of P, returning the location. J stands for Join.

to = P[J(R$max_x),which=TRUE]
# Lookup each max_x in the key of P, returning the location.

len = to-from+1
# vectorized for each item the length to[i]-from[i]+1

i = unlist(mapply("seq.int",from,to,SIMPLIFY=FALSE))
# for each item the sequence from[i]:to[i], then concat them all into one vector

cbind(rep(R$id,len), P[i])
# use len to expand the items of R to match what they match to in P
于 2012-06-22T17:07:24.263 回答