2016-06-12 39 views
2

我有一個如下所示的數據框,它是分類器的輸出。在R數據框中查找列值跟在序列後面的行

col1, class 
123, 2 
122, 5 
124, 7 
125, 9 
126, 15 
127, 2 
128, 19 
129, 5 
130, 7 
179, 9 
180, 3 

我想找到有類的一定的模式,就像它的類在SEQ 5,7,9所有行的行。

我想出瞭解決方案通過移位一行和比較列如下

col1, class, class1, class2 
123, 2,5,7 
122, 5,7,9 
124, 7,9,15 
125, 9,15,2 
126, 15,2,19 
127, 2,19,5 
128, 19,5,7 
129, 5,7,9 
130, 7,9,3 
179, 9,3,NA, 
180, 3,NA,NA 

這解決了只有我的圖案場的數量是相同的,但我會改變的是粘貼班列。有些模式甚至可能有5至7個字段。

回答

2

我們可以使用shiftdata.table,然後paste的元素結合在一起,並檢查,我們有579

n <- 3 
library(data.table) 
setDT(df1)[, which(do.call(paste0, shift(class, seq(n)-1, type = "lead"))=="579")] 
#[1] 2 8 

或代替paste我們可以使用MapReduce

setDT(df1)[, which(Reduce(`&`, Map(`==`, shift(class, seq(n)-1, 
      type = "lead"), c(5, 7, 9))))] 
#[1] 2 8 
2

稍微更長時間基礎R替代,原則上類似於@ akrun的回答:

which(do.call(paste0, cbind(df1, with(df1, class[seq_along(class)+1]), 
          with(df1, class[seq_along(class)+2]))[-1]) == "579") 
#[1] 2 8 

數據:

df1 <- structure(list(col1 = c(123L, 122L, 124L, 125L, 126L, 127L, 128L, 
           129L, 130L, 179L, 180L), class = c(2L, 5L, 
           7L, 9L, 15L, 2L, 19L, 5L, 7L, 9L, 3L)), 
           .Names = c("col1", "class"), class = "data.frame", 
           row.names = c(NA, -11L)) 
+1

我覺得還有用'matrix'選項 – akrun

相關問題