2016-08-13 87 views
0

我有一大組數據,我已將它們分成一個列表。下面是從列表中元素的一個小樣本:如何將元素與另一行中的另一個元素和另一列中的另一個元素進行比較

>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來比較以前的值與兩列中的當前值,通過刪除那些列中的第一個觀察值和最後一個觀察值,比較,追加TRUE(因爲長度比列中的元素)並將其用於子集'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,] 

然後寫一個添加到pa 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

相關問題