2016-08-13 7 views
0

У меня есть большой набор данных, которые я разделил на список. Ниже приведен небольшой пример одного из элементов списка:Как сравнить элемент с другим элементом в другой строке и другом столбце в r

>tes 
     Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 
24852 1 67th & Frances 2013-05-18 09:27:13 Aksarben Drive 2013-05-18 10:05:29 
24864 1 Aksarben Drive 2013-05-18 10:47:13 Aksarben Drive 2013-05-18 10:52:24 
24998 1 Aksarben Drive 2013-06-05 19:48:05 67th & Frances 2013-06-26 17:06:52 
25434 1 67th & Frances 2013-06-26 19:10:28 67th & Frances 2013-06-26 20:08:09 

Я хочу, чтобы сравнить ReturnKioskName в следующих строках CheckoutKioskName и если они не совпадают, я хочу два флага эти две строки и поместить их в новые данные Рамка. Я попытался сделать это несколькими разными способами и хотел бы избежать создания нового фрейма данных, изначально просто для перемещения ReturnKioskName. Я попытался использовать:

tes <- tes[tes$CheckoutKioskName != lag(tes$ReturnKioskName),] 

Но это не дает мне выход, который я бы хотел. Предпочтительный выход должен выглядеть следующим образом:

24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 

Это должно быть в этом маленьком примере, потому что это единственный раз, когда они не совпадают. Я планирую использовать этот процесс для создания гигантского списка этих экземпляров после того, как я запустил его через каждый элемент моего большого списка ('fz').

Благодарю вас за любую помощь, которую вы можете предоставить.

ответ

0

Прежде всего я хочу поблагодарить всех за все идеи и не торопиться, чтобы ответить на мою проблему. Используя идеи от всех, я смог решить проблему с этим кодом:

mismatch <- tes[tes$CheckoutKioskName[-1] != tes$ReturnKioskName & tes$co != nrow(tes),'co'] 
mismatch.pairs <- c(mismatch, mismatch +1) 
tes[tes$co %in% mismatch.pairs,] 
1

Мы можем использовать base R, чтобы сравнить предыдущее значение с текущим в двух столбцах, удалив первое наблюдение и последнее наблюдение в этих столбцах, сравните, добавьте с ИСТИННЫМ (поскольку длина на один меньше, чем число элементы в столбце) и использовать их для подмножества строк tes.

tes[with(tes, c(TRUE, CheckoutKioskName[-1] != ReturnKioskName[-nrow(tes)])),] 
#  Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
#24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
#24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 

Причина lag (от dplyr не работал), потому что опция default является NA, если мы изменим default, она могла бы работать.

tes[with(tes, CheckoutKioskName != lag(ReturnKioskName, 
           default = ReturnKioskName[1])),] 
#  Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
# 24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
# 24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 
0

Я не думаю, что это работает для всего кадра данных. У меня есть один элемент списка, который я тестирую, прежде чем запускать его по всему списку. Я использовал ваш код выше на df, но до этого я создал новый столбец, поддерживающий количество строк. Если код работает правильно, я должен видеть номера столбцов в последовательных парах (т. Е. 1 & 2, затем 21 & 22 так далее ..), но это не то, что произошло.

 Bike    CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
24627 1     67th & Pine       Shop 2013-03-12 17:54:22 2013-03-12 20:32:40 1 
24847 1     67th & Frances     67th & Frances 2013-05-17 10:31:44 2013-05-17 10:51:53 2 
23075 1 Bob Kerrey Pedestrian Bridge     13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
23212 1     13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 
23370 1 Bob Kerrey Pedestrian Bridge     13th & Howard 2014-10-28 12:49:42 2014-10-28 23:05:05 119 
23379 1     13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-30 09:50:55 2014-10-30 10:06:10 121 
23686 1 Bob Kerrey Pedestrian Bridge Tom Hanafan River's Edge Park 2014-11-22 15:16:46 2014-11-22 16:57:24 131 
23723 1 Tom Hanafan River's Edge Park   Lewis & Clark Landing 2014-11-28 13:54:32 2014-11-28 15:10:35 133 
23750 1   Lewis & Clark Landing Tom Hanafan River's Edge Park 2014-11-29 14:06:20 2014-11-29 14:20:03 135 
23753 1 Tom Hanafan River's Edge Park Bob Kerrey Pedestrian Bridge 2014-11-29 14:28:02 2014-11-29 14:48:28 139 
7014  1   Lewis & Clark Landing   Lewis & Clark Landing 2015-06-02 17:52:41 2015-06-02 19:32:31 154 

Если вы посмотрите на дальний столбец «co», вы увидите, что пары не последовательны. Я не уверен, почему я получаю такие разные пары.

@akrun У вас есть идея, что может произойти?

+0

Также код запаздывания не работал, и на самом деле он дал отличный результат, чем базовую версию r. – Brett

+1

Можете ли вы предоставить минимальный ввод, который производит неверный вывод с предоставленным решением, будет легче устранить неполадки. Вы можете использовать 'dput' в небольшом наборе данных и вставить результаты. Это ускорит анализ. – steveb

+0

Я предполагаю, что это должно быть редактирование по вашему вопросу, а не ответ. Я использовал ваш пример, и он дает ожидаемый результат. – akrun

0

Вы хотите сохранить обе строки из непревзойденной пары?В этом случае сначала получить индексы, соответствующие первый элемент несоответствующих пар:

mismatch <- which(test$CheckoutKioskName[-1] != test$ReturnKioskName[-nrow(tes)]) 

затем извлечь эти строки и следующие из них:

tes[sort(c(mismatch, mismatch + 1)), ] 
+0

Это дает мне чрезвычайно странный результат. – Brett

+0

Я редактировал для сортировки строк. –

0

Вот немного больше набора данных:

> so 
     Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
612  1    13th & Howard    13th & Howard 2014-10-18 14:17:45 2014-10-18 15:37:54 92 
23130 1    13th & Howard    13th & Howard 2014-10-18 14:17:45 2014-10-18 15:37:54 93 
694  1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 94 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 
702  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-21 17:21:00 2014-10-21 17:23:21 96 
23220 1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-21 17:21:00 2014-10-21 17:23:21 97 
722  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 16:38:25 2014-10-23 17:30:54 98 
23240 1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 16:38:25 2014-10-23 17:30:54 99 
729  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 21:53:14 2014-10-23 22:25:21 100 

Глядя на это подмножество, если я успешен, я должен получить две пары, которые должны быть:

 Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
694  1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 94 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 

Но когда я бегу:

so[with(so, c(TRUE, CheckoutKioskName[-1] != ReturnKioskName[-nrow(so)])),] 

я получаю:

 Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 

Я начинаю задаваться вопросом, будет ли это легче всего сделать простое сравнение, чтобы получить строку, где ReturnKioskName Безразлично «т соответствуют следующим CheckoutKioskName с помощью:

tes[tes$CheckoutKioskName[-1] != tes$ReturnKioskName,] 

Затем написать добавить на ра ir вывод каждой строки со следующей строкой в ​​df. Потому что, если я запустил этот код, я получаю:

 Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
694 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 94 

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

+0

@stevb вот немного больше информации – Brett