2014-05-20 44 views
0

我有一個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)中。

+0

'dt [yourpattern,V7]'? – eddi

回答

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 
+1

呃,對'data.frame'很好,但對'data.table'的使用很糟糕 - 看到'df'被重複多少次使我害怕 – eddi

+0

@eddi對此感到抱歉..好吧,我承認我當然不是data.table專家。我只是想了一個相對簡單的操作,它可能與data.frame的工作方式相同。幸運的是,Arun的答案與完美data.table-like-kind的方式:) –

+0

:)哈哈;你可以通過編寫'n = df [,min(其中((V2 == -147&...]'而不是 – eddi

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值。也是模式不返回任何匹配的情況。我會留給你來解決這些邊緣案例。

相關問題