如何将元素与r中不同行和不同列中的另一个元素进行比较

How to compare an element to another element in a different row and different column in 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') 的每个元素后,使用此过程创建这些实例的大列表。

非常感谢您提供的任何帮助。

我们可以使用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

我认为这不适用于整个数据框。在我 运行 遍历整个列表之前,我有一个列表元素正在对其进行测试。我在 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' 列,您会发现这些对不是连续的。我不确定为什么我会得到如此不同的配对。

@ak运行你知道会发生什么吗?

您是否希望保留来自不匹配对的两行?在这种情况下,首先获取与不匹配对的第一个元素对应的索引:

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

然后提取这些行和以下行:

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

这是一组更大的数据:

> 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,]

然后编写一个附加项,将每一行的输出与 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

然后我只需要弄清楚如何添加连续的行。

我首先要感谢大家的所有想法并花时间回复我的问题。使用每个人的想法,我能够用这段代码解决问题:

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