2016-12-09 2 views
0

У меня есть следующий кадр данных:Извлечение уникальных последовательностей из значений DF Colum с R

Col1 Col2 
1 A 
1 B 
1 C 
2 A 
2 B 
2 C 
3 D 
3 B 
3 C 
3 F 
4 A 
4 B 
4 C 

я хотел бы извлечь векторы unque последовательности (линия шины стоп-последовательность) от Col2 (фактических остановок конкретного автобуса маршрут), где каждая последовательность определяется Col1 (соответствующие идентификаторы маршрута шины) в R. Многократное появление идентичных последовательностей несущественно. Таким образом, желаемые выходы:

A, B, C (в случаях Col1 = 1, 2 и 4) и D, B, C, F (в случае Стлб1 = 3)

+1

'уникальный (с (df, tapply (Col2, Col1, toString)))' приходит на ум –

+0

или 'unique (aggregal (Col2 ~ Col1, df, toString) $ Col2)' – Sotos

+0

Это последний хороший шаг , но: 1.) Исходный порядок последовательности должен поддерживаться (ваше решение дает буквенный порядок, если печатается), 2.) Кажется, что все возможные последовательности объединяются в одну «суперсимметрию». Мне нужны все возможные вариации последовательности. – Hendrik

ответ

2

Можно разделить вектор автобусной остановки в соответствии вектор идентификаторов маршрута. Это вернет список символьных векторов, на которые вы можете позвонить unique, чтобы удалить дублированные векторы (сохраняя первое вхождение).

Вызов toString на каждом из этих векторов через sapply преобразует список векторов в вектор разделенных запятыми строк.

res <- sapply(unique(split(df$Col2, df$Col1)), toString) 
print(res) 
+0

, по крайней мере, поместите некоторую работу, чтобы сделать их строками и unlist - хорошая идея, хотя – Sotos

+0

что-то вроде 'sapply (unique (split (df $ Col2, df $ Col1)), toString)' будет делать трюк – Sotos

+0

@Sotos Формат вывода не был указан, поэтому я сосредоточился на ядре решения. Также я думаю, что мое решение ближе к описанию «векторов последовательности», чем строка, разделенная запятыми. – mpjdem

0

С вашего вопроса я понял, что вам нужны уникальные последовательности для каждого идентификатора col1. Для тестирования я немного изменил данные (и я использовал пакет data.table). Что вы могли бы попробовать следующий:

require(data.table) 
df <- fread('Col1 Col2 
       1 A 
       1 B 
       1 C 
       2 A 
       2 B 
       2 C 
       1 A 
       1 B 
       1 C 
       3 D 
       3 B 
       3 C 
       3 F 
       1 A 
       1 F 
       1 C 
       4 A 
       4 B 
       4 C') 

В вашем случае, если кадр данных называется DF просто setDT(df), чтобы превратить его в таблицу данных. И из этой таблицы данных выбрать уникальные последовательности в Col2 от:

df[, .(list(Col2), Col1), by = rleid(Col1)][,.(Sequence = unique(V1)), by = Col1] 

Что дает:

Col1 Sequence 
1: 1 A,B,C 
2: 1 A,F,C 
3: 2 A,B,C 
4: 3 D,B,C,F 
5: 4 A,B,C 

Что команда делает следующее: Кулак, для каждого ID в Col1 я получаю в Col2 (я использую функцию rleid для идентификации непрерывных идентификаторов в Col1). Затем я выбираю уникальные последовательности по каждому значению Col1.

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