r - 如何选择一组中的 2 行,它们在某列中具有相同的值而在一列中具有不同的值?
问题描述
我有一个家庭的 col1 索引,每个家庭中的人员的 col2 索引,每个人的 col3 出行方式,col4 和 col5 活动的开始和结束时间我如何选择每个家庭中的一些行,司机和乘客有相同的开始时间和结束时间?
例子:
family persons mode start time end time
1 1 driver 3 8:45
1 1 walk 8:45 13:30
1 1 bus 13:30 15
1 1 driver 15:00 15:30
1 2 walk 15:00 15:30
1 2 driver 22:00 8:30
1 3 passenger 15:00 15:30
1 3 walk 8:00 17:00
1 4 bus 17:00 24:00
1 4 passenger 15:00 15:30
1 4 walk 23:00 24:00
2 1 driver 8:00 10:00
2 1 driver 23:00 24:00
2 2 passenger 23:00 24:00
在第一个家庭中,第一人和第二人是司机,第三人和第四人是乘客,两个乘客的开始和结束时间由第一个司机(15:00 t0 15:30)匹配,所以我需要保留3行:( 4 ,7,10)
第二家庭的司机和乘客也很相配。所以输出是:
family persons mode start time end time
1 1 driver 15:00 15:30
1 3 passenger 15:00 15:30
1 4 passenger 15:00 15:30
2 1 drive 23:00 24:00
2 2 passenger 23:00 24:00
备注:第一个家庭的第二个人和乘客的开始和结束时间相同,但她的模式是步行而不是司机,所以我们不需要那一行
解决方案
一个选项是按“家庭”、“开始时间”、“结束时间”和filter
大于 1 的行数进行分组
library(dplyr)
df1 %>%
group_by(family, starttime, endtime) %>%
filter(n() > 1)
# A tibble: 5 x 5
# Groups: family, starttime, endtime [2]
# family persons mode starttime endtime
# <int> <int> <chr> <chr> <chr>
#1 1 1 driver 15:00 15:30
#2 1 3 passenger 15:00 15:30
#3 1 4 passenger 15:00 15:30
#4 2 1 drive 23:00 24:00
#5 2 2 passenger 23:00 24:00
如果我们只需要对选定的“模式”执行此操作,请%in%
与现有的逻辑一起使用附加逻辑
df1 %>%
group_by(family, starttime, endtime) %>%
filter(n() >1, mode %in% c("driver", "passenger"))
或者在 中base R
,一个选项是创建逻辑向量duplicated
df1[duplicated(df1[c(1, 4, 5)])|duplicated(df1[c(1, 4, 5)], fromLast = TRUE),]
数据
df1 <- structure(list(family = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L), persons = c(1L, 1L, 1L, 1L, 2L, 2L, 3L,
3L, 4L, 4L, 4L, 1L, 1L, 2L), mode = c("driver", "walk", "bus",
"driver", "driver", "driver", "passenger", "walk", "bus", "passenger",
"walk", "drive", "drive", "passenger"), starttime = c("3", "8:45",
"13:30", "15:00", "20:00", "22:00", "15:00", "8:00", "17:00",
"15:00", "23:00", "8:00", "23:00", "23:00"), endtime = c("8:45",
"13:30", "15", "15:30", "22:00", "8:30", "15:30", "17:00", "24:00",
"15:30", "24:00", "10:00", "24:00", "24:00")),
class = "data.frame", row.names = c(NA,
-14L))
推荐阅读
- android - 如何以编程方式更改 xml 可绘制属性
- jquery - 单击 li 时,将隐藏类添加到所有 li 但不添加到单击的 li 并删除类(如果该 li 已使用 jquery)
- linux - Unix - 在while循环中替换列值
- java - 垂直滑动手指以打开碎片
- apache - 尝试在 Apache 上运行乘客时出现问题
- swi-prolog - 如何在跟踪时撤消 SWI-Prolog 中的“写入”?
- node.js - 如何通过 JSON 操作查询的数据?
- java - Java 8 将对象添加到列表的有效方法
- c++ - 关于正确使用设置器和变量的问题
- c# - 在 C# WPF 中使用数据表过滤数据网格的正确方法