2016-04-08 22 views
0

İki sütunlu bir veri çerçevem ​​var, bir ikinci veri çerçevesindeki satırları endeksleyen bir dizin sütunu. Bu satırların hepsi belirli bir etkinlik içerir. Bu olay, ikinci sütunda, burada code_start_stop olarak kodlanmıştır.R Veri çerçevesini temizlemenin akıllı yolu

Örnek:

index <- c(769, 766, 810, 813, 830, 842, 842, 892, 907, 944) 
code_start_stop <- c(2006, 2001, 2004, 1001, 1004, 2001, 1001, 1006, 2004, 1004) 
replace_all <- data.frame(index, code_start_stop) 

Şimdi başlangıç ​​çiftleri vardır/durdurma kodları, yani 2001 ile 1001, 2002 ve 1002, vb amacı durumda bir tarafından içine alınır dizisi olacak, yani işaretçiyi (yani 2006) ve ilgili sonraki durdurma işaretini (burada 1006) başlatın, bu satırlar veri çerçevesinden kaldırılmalıdır. Her zaman başlangıç ​​çiftinin & dur işareti olduğunu unutmayın.

Bunun nasıl yapılacağı konusunda akıllıca bir öneride bulunulur. Teşekkürler!

+0

kaldırmak 'endeksi 've' code_start_stop' burada farklı uzunluklara sahiptir, bu yüzden 'replace_all' mevcut kodla oluşturulamaz. – alistaire

cevap

0

Sorunuz biraz kafa karıştırıcı, lütfen yanlış anladıysam beni düzeltin. aşağıdaki çalışması gerekir:

startm <- 2006 #startmarker 
endm <- 1006 #endmarker 

#look for row that contains markers 
index1 <- which(replace_all[,2] == startm) 
index2 <- which(replace_all[,2] == endm) 

#subset accordingly 
replace_all <- replace_all[-(index1:index2),] 

Not: Bu, satırlar kaldırır, işaretleyiciler ihtiva eden. İşaretleri yalnızca satırlar arasında kaldırmak isterseniz, altlık adımında bir + 1/-1 ekleyin.

+0

Çok teşekkürler! Ancak, ben her şeyden önce başlangıç ​​ve bitiş işaretlerinin çiftleri vardır: 'startm1 <- 2001 endm1 <- 1001 .... startm6 <- 2006 endm6 <- 1006' Üstelik belirteçlerin her bir çift oluşabilir n veri çerçevesindeki zamanlar (yukarıdaki örnekden önemli ölçüde daha büyüktür). –

+0

Bu çiftleri kolayca geçebilirsiniz – maRtin

0

Çözüm şimdi maRin'in önerisine dayanıyor ve oldukça iyi çalışıyor gibi görünüyor.

Ben başlangıç ​​ve bitiş işaretlerinin tüm çiftleri geçiyor şunları yapın:

to_delete <- c() 
## Care = 2001/1001 
startm1 <- 2001 
endm1 <- 1001 
index1 <- which((replace_all[,2] == startm1)) 
index2 <- which((replace_all[,2] == endm1)) 
if(length(index1) !=0){ 
    for (i in 1:length(index1)){ 
    if (index2[i]-index1[i]>1){ 
     to_delete <- c(to_delete, (((index1[i])+1):((index2[i])-1))) 
    } 
    } 
} 

... baştan diğer tüm çiftleri geçmesi/işaretçileri durdurmak ve daha sonra to_delete

if (length(to_delete) != 0){ 
    replace_all <- replace_all[-to_delete,] 
    } 
    replace_all <- replace_all[,1] 
    } 
İlgili konular