假设我有
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
在第一个家庭中,第一人称在第一个循环的第一行有汽车模式,因此我删除了他在第一个循环的所有行程,只保留了第一个。他的第二个循环没有汽车模式,所以我保留了所有模式。第二人称也没有汽车模式,所以我保留了所有。第二个家庭第一人称在他的第一个循环中有自动驾驶汽车,所以我保留了第一排,并在循环中移走了休息。他的第二个循环有一行,所以我保留了它,第二个人没有汽车模式,所以我保留了它。
答案 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))