2016-01-28 2 views
1

Как выбрать только строки, за которыми следует одно и то же значение в определенном столбце?Выберите только конкретные случаи из dataframe

т.е. от этого (с использованием в качестве эталона значения v1)

`v1 = c(1,1,2,3,1,2,4,1,1,2,3,4) 
v2 = seq(1:12) 
v3 = c(rep("blue", 4), rep("red", 4), rep("green", 4)) 
df<- data.frame(v1, v2, v3) 
df` 

> df 
    v1 v2 v3 
1 1 1 blue 
2 1 2 blue 
3 2 3 blue 
4 3 4 blue 
5 1 5 red 
6 2 6 red 
7 4 7 red 
8 1 8 red 
9 1 9 green 
10 2 10 green 
11 3 11 green 
12 4 12 green 

к этому; где случаи 1 и 8, которые следуют случаи, когда значение v1 также 1 сохраняются только

v1 v2 v3 
1 1 1 blue 
8 1 8 red 

ответ

0

Вы можете извлечь интересующие индексы, а затем извлечь интересующие строки из фрейма данных.

indices <- which(df$v1[1:(nrow(df)-1)]==df$v1[2:nrow(df)]) 
df.new <- df[indices,] 
+0

Опция @Christopher Brown быстрее, чем akrun. В моем фрейме данных более 1,600,000 случаев, опция akrun занимает от 15 'до 20'. Второй - всего несколько секунд. –

2

Мы можем использовать rleid из data.table, чтобы получить идентификатор типа с переменной длиной, использовать это как группировку переменного, и if nrow больше 1 (.N >1), выберите первое наблюдение (head(.SD, 1L)).

library(data.table) 
setDT(df)[, if(.N>1) head(.SD, 1L) ,.(v1,rleid(v1))][,rleid:= NULL][] 
# v1 v2 v3 
# 1: 1 1 blue 
# 2: 1 8 red 

Примечание: Превратим 'data.frame' к 'data.table' с setDT(df).

+1

Это не масштабируемое решение вопроса – mtoto

+0

@mtoto Можете ли вы объяснить, что вы имели в виду? – akrun

+0

Я отредактировал его вопрос, не был ясен для меня либо поначалу. Он хочет вернуть строки, имеющие такое же значение в следующей строке 'v1' – mtoto

Смежные вопросы