我希望按行查找兩個模式的第一個實例。具體而言,我想查找的每一行中第一次出現c(1,0)
和第一次出現c(1,1)
。下面的代碼使用嵌套的for-loops
這樣做,但對於大型數據集非常慢。按行查找模式的第一個匹配項
有沒有辦法在基地R
有效地做到這一點?這個問題是相似的:
Finding pattern in a matrix in R
這是我的代碼,如果該圖案在第1列開始,並且在第2列和結束如果圖案不連續發生返回0
它返回一個2
。
n <- 5
my.data <- expand.grid(rep(list(1:0), n))
my.data <- my.data[do.call(order, as.list(my.data)),]
my.data <- my.data[order(nrow(my.data):1),]
first.11 <- rep(0, nrow(my.data))
first.10 <- rep(0, nrow(my.data))
for(i in 1:nrow(my.data)) {
for(j in 1:(ncol(my.data)-1)) {
if(first.11[i] == 0 & my.data[i,j] == 1 & my.data[i,(j+1)] == 1) first.11[i] = j+1
if(first.10[i] == 0 & my.data[i,j] == 1 & my.data[i,(j+1)] == 0) first.10[i] = j+1
}
}
my.data2 <- data.frame(my.data, first.11, first.10)
my.data2
# Var1 Var2 Var3 Var4 Var5 first.11 first.10
#1 1 1 1 1 1 2 0
#17 1 1 1 1 0 2 5
#9 1 1 1 0 1 2 4
#25 1 1 1 0 0 2 4
#5 1 1 0 1 1 2 3
#21 1 1 0 1 0 2 3
#13 1 1 0 0 1 2 3
#29 1 1 0 0 0 2 3
#3 1 0 1 1 1 4 2
#19 1 0 1 1 0 4 2
#11 1 0 1 0 1 0 2
#27 1 0 1 0 0 0 2
#7 1 0 0 1 1 5 2
#23 1 0 0 1 0 0 2
#15 1 0 0 0 1 0 2
#31 1 0 0 0 0 0 2
#2 0 1 1 1 1 3 0
#18 0 1 1 1 0 3 5
#10 0 1 1 0 1 3 4
#26 0 1 1 0 0 3 4
#6 0 1 0 1 1 5 3
#22 0 1 0 1 0 0 3
#14 0 1 0 0 1 0 3
#30 0 1 0 0 0 0 3
#4 0 0 1 1 1 4 0
#20 0 0 1 1 0 4 5
#12 0 0 1 0 1 0 4
#28 0 0 1 0 0 0 4
#8 0 0 0 1 1 5 0
#24 0 0 0 1 0 0 5
#16 0 0 0 0 1 0 0
#32 0 0 0 0 0 0 0
模式的「長度」總是2嗎?你可以嘗試像'max.col((my.data [,-ncol(my.data)] == 1L)&(my.data [,-1L] == 0L),「first」)+ 1L'在處理'rowSums == 0'的情況下。 –
@alexis_laz謝謝。是的,我只考慮了兩個模式的長度。也許在某些時候,我可能想要概括它。 –