如果在data.table中找到模式,则提取部分列

时间:2014-05-20 20:43:18

标签: r pattern-matching data.table

我有一个data.table,我想将一个模式列的向量部分放入其他列中。例如,我有以下data.table:

library(data.table)
df <- fread('./file')
df

        V1   V2  V3 V4 V5      V6 V7 V8 V9
   1:    0 -148 -49 -1  X     CAT  5  0 NA
   2:    1 -147 -49  5  X     FOT  12 0 NA
   3:    2 -146 -49  3  X     FAT  53 0 NA
   4:    3 -145 -48 -2  X     BYE  10 0 NA
   5:    4 -144 -48  0  X     GOO  2  0 NA

我想从V7中提取存在于一组模式之间的值,并将V7中的值放入向量中。

起始模式如下:

V2 == -147 & V4 == 5 & V6 == 'FOT'

结束模式是:

V4 == -2 & V6 == 'BYE' 

如果找到这些模式,则从它们之间的V7中提取值。因此应将12,53,10放入向量(x)中。

2 个答案:

答案 0 :(得分:2)

我能想到的一种方法是使用which=TRUE

start = DT[V2 == -147 & V4 == 5 & V6=='FOT', which=TRUE] ## [1] 2L
end   = DT[V4 == -2 & V6=='BYE', which=TRUE] ## [2] 4L

DT[start:end, V7]
# [1] 12 53 10

请注意,如果有多个匹配项,则会返回所有索引。您可能需要选择相应的startend值。也是模式不返回任何匹配的情况。我会留给你解决这些边缘案件。

答案 1 :(得分:1)

这应该这样做:

n <- min(which((df$V2 == -147 & df$V4 == 5 & df$V6 =='FOT') == TRUE)) #determine the start

m <- max(which(df$V4 == -2 & df$V6 == 'BYE'))   #determine the end

x <- df$V7[n:m]

>x
#[1] 12 53 10