如何将元素与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,]
我有一大组数据,我已拆分成一个列表。以下是列表元素之一的小示例:
>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,]