2016-05-27 2 views
1

Я пытаюсь очистить свои данные в R (cc. 1M строк). Для каждого E (ntity) я хотел бы удалить строки, которые появляются после последнего вхождения 1 в столбце V (alue). Строки упорядочены по E и A (ttribute). Что было бы эффективным способом сделать это?Удаление строк после последнего появления значения в каждой группе

Пример:

Из этого

E = c(1,1,1,2,2,2,2,3,3,3,3,3) 
A = c(1,2,3,1,2,3,4,1,2,3,4,5) 
V = c(1,0,1,0,0,1,0,1,1,1,0,0) 
df = data.frame(E,A,V) 
df 

Я хотел бы создать этот

E = c(1,1,1,2,2,2,3,3,3) 
A = c(1,2,3,1,2,3,1,2,3) 
V = c(1,0,1,0,0,1,1,1,1) 
df = data.frame(E,A,V) 
df 

ответ

3

Мы можем использовать data.table:

library(data.table) 
setDT(df)[, .SD[seq_len(max(which(V==1)))], by = E] 
# E A V 
#1: 1 1 1 
#2: 1 2 0 
#3: 1 3 1 
#4: 2 1 0 
#5: 2 2 0 
#6: 2 3 1 
#7: 3 1 1 
#8: 3 2 1 
#9: 3 3 1 

Или другой вариант был бы U се head (с комментариями @Procrastinatus Maximus)

setDT(df)[, head(.SD, max(which(V==1))), by = E] 

Или мы можем использовать .I

setDT(df)[df[, .I[seq_len(max(which(V==1)))], by = E]$V1] 
+2

или: 'setDT (ДФ) [глава (.sd , max (который (V == 1))), by = E] ' – Jaap

+1

Я пошел с setDT (df) [, head (.SD, max (который (V == 1))), by = E] as он может обрабатывать случаи со всеми 0-с – SunWuKung

1

Использование dplyr:

library(dplyr) 
df %>% group_by(E) %>% slice(1:max(which(V == 1))) 
Смежные вопросы