2016-04-08 3 views
0

У меня есть кадр данных с двумя столбцами, индексный столбец, который индексирует строки во втором кадре данных. Все эти строки содержат конкретное событие. Какое событие это, закодировано во втором столбце, здесь называется code_start_stop.R Умный способ очистки фрейма данных

Пример:

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) 

В настоящее время существуют пары старт/стоп-кодов, то есть 2001 и 1001, 2002 и 1002 и т.д. Цель состоит в том, что, в случае, если есть строки, которые заключены в (т.е. здесь 2006) и соответствующий следующий маркер остановки (здесь 1006), эти строки должны быть удалены из фрейма данных. Обратите внимание, что всегда есть пары начала & маркеры остановки.

Любые предложения по умному способу, как это сделать, оцениваются. Благодаря!

+0

'индекс 'и' code_start_stop' имеют разные длины здесь, поэтому 'replace_all' не может быть создан с помощью текущего кода. – alistaire

ответ

0

Ваш вопрос немного запутанный, пожалуйста, исправьте меня, если я ошибаюсь. должно работать:

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),] 

Примечание: Это удаляет также строки, содержащий маркеры. Если вы хотите удалить только строки между отметками, добавьте + 1/-1 на этапе подмножества.

+0

Спасибо большое! Тем не менее, у меня прежде всего есть пары начальных и конечных маркеров: 'startm1 <- 2001 endm1 <- 1001 .... startm6 <- 2006 endm6 <- 1006' Кроме того, каждая пара маркеров может иметь место n времени в кадре данных (что значительно больше, чем пример выше). –

+0

Вы можете просто перебрать эти пары – maRtin

0

Решение теперь основано на предложении maRtin и, кажется, работает очень хорошо.

я делаю следующее перебирая все пары начальных и конечных маркеров:

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))) 
    } 
    } 
} 

... пройти через все другие пары пуска/останова маркеров, а затем удалить to_delete

if (length(to_delete) != 0){ 
    replace_all <- replace_all[-to_delete,] 
    } 
    replace_all <- replace_all[,1] 
    } 
Смежные вопросы