R 如何选择一个组中的两行,其中某列中的值相同,而某列中的值不同?

R 如何选择一个组中的两行,其中某列中的值相同,而某列中的值不同?,r,dataframe,R,Dataframe,我有一个col1家庭指数,col2每个家庭的人员指数,col3每个人的旅行方式,col4和col5活动的开始和结束时间如何选择每个家庭中的某一行,司机和乘客的开始时间和结束时间相同 例如: family persons mode start time end time 1 1 driver 3 8:45 1 1 walk 8:45

我有一个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到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     

备注:第一组中的第二个人与乘客有相同的开始和结束时间,但她的模式是步行而不是驾驶,因此我们不需要该行

一个选项是按“家庭”、“开始时间”、“结束时间”和
过滤大于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  

或者在
base R
中,一个选项是使用
duplicated

df1[duplicated(df1[c(1, 4, 5)])|duplicated(df1[c(1, 4, 5)], fromLast = TRUE),]
数据
df1一个选项是按“系列”、“开始时间”、“结束时间”和
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  

或者在
base R
中,一个选项是使用
duplicated

df1[duplicated(df1[c(1, 4, 5)])|duplicated(df1[c(1, 4, 5)], fromLast = TRUE),]
数据
df1它是如何意识到我在驾驶员和乘客模式下需要它的,而不是在步行模式下?@sherek_66。好的,在这种情况下,我们可以对过滤器进行更改,因为使用复制功能,我还可以获得其他模式。hi@sherek_66,如果您安装了
dplyr
软件包,您只需执行
?分组操作
,以了解有关该dplyr功能的更多信息。您还可以在堆栈中搜索
[groupby][dplyr]
,这将显示使用此函数了解更多信息的其他示例。@sherek_66。我更新了答案。在这个例子中,其中一个名字是“drive”,而不是“driver”,拼写错误?它是如何意识到我在驾驶员和乘客模式下需要这个,而不是在步行模式下?@sherek_66。好的,在这种情况下,我们可以对过滤器进行更改,因为使用复制功能,我还可以获得其他模式。hi@sherek_66,如果您安装了
dplyr
软件包,您只需执行
?分组操作
,以了解有关该dplyr功能的更多信息。您还可以在堆栈中搜索
[groupby][dplyr]
,这将显示使用此函数了解更多信息的其他示例。@sherek_66。我更新了答案。在本例中,其中一个名称是“drive”而不是“driver”,拼写错误?