2016-08-13 71 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

相关问题