使用data.table包或其他解决方案子集和重新组合数据帧[R]

时间:2012-06-22 13:31:34

标签: r data.table

我对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)!

提前谢谢。

抱歉英语不好。

1 个答案:

答案 0 :(得分:4)

这在data.table中是不可能的。它是FR#203来实现的。您可以尝试使用包xts,因为我认为有此操作。

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