首页 > 解决方案 > 如何选择一组中的 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     

备注:第一个家庭的第二个人和乘客的开始和结束时间相同,但她的模式是步行而不是司机,所以我们不需要那一行

标签: rdataframe

解决方案


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

推荐阅读