如何删除每个组中的某些行并保持第一行?

时间:2019-09-04 18:46:15

标签: r dataframe

假设我有

    family   person     loop.     mode      
     1      1          1        car
     1       1         1          walk
     1       1         1         car
     1       1         2         walk
     1       1         2          bus
     1       2         1          bus
     1       2         1          walk
     1       2         2          bus
     2       1         1           car
     2       1         1           car
     2       1         2          car
     2       2        1           bus

我想要这个:

每个人每个家庭都有一个循环。我想为每个人和每个家庭保留每个循环的第一行(如果是汽车),并删除该循环中的所有其他行(如果是汽车,公共汽车或步行)。如果循环的第一行不是汽车,我什么也不会移除

输出:

    family   person     loop.     mode      
     1      1          1          car
     1       1         2          walk
     1       1         2          bus
     1       2         1          bus
     1       2         1          walk
     1       2         2          bus
     2       1         1          car
     2       1         2          car
     2       2        1           bus

在第一个家庭中,第一人称在第一个循环的第一行有汽车模式,因此我删除了他在第一个循环的所有行程,只保留了第一个。他的第二个循环没有汽车模式,所以我保留了所有模式。第二人称也没有汽车模式,所以我保留了所有。第二个家庭第一人称在他的第一个循环中有自动驾驶汽车,所以我保留了第一排,并在循环中移走了休息。他的第二个循环有一行,所以我保留了它,第二个人没有汽车模式,所以我保留了它。

1 个答案:

答案 0 :(得分:2)

一个选项是按“家庭”,“人”,“循环”和slice分组,只有“模式”的if元素的第一行first是“汽车”,否则返回全部行数

library(dplyr)
df1 %>%
    group_by(family, person, loop.) %>%
    slice(if(first(mode) == 'car') 1 else row_number())
# A tibble: 9 x 4
# Groups:   family, person, loop. [7]
#  family person loop. mode 
#   <int>  <int> <int> <chr>
#1      1      1     1 car  
#2      1      1     2 walk 
#3      1      1     2 bus  
#4      1      2     1 bus  
#5      1      2     1 walk 
#6      1      2     2 bus  
#7      2      1     1 car  
#8      2      1     2 car  
#9      2      2     1 bus  

数据

df1 <- structure(list(family = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L), person = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L), loop. = c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
1L), mode = c("car", "walk", "car", "walk", "bus", "bus", "walk", 
"bus", "car", "car", "car", "bus")), class = "data.frame", row.names = c(NA, 
-12L))