R语言 筛选出位于其他行的时间范围内的行

dgiusagp  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(59)

我有一个类似这样的框架:
| 模型|动力系|起始年|年终|
| --|--|--|--|
| car1|柴油| 2010 | 2015 |
| car1|柴油| 2011 | 2013 |
| car1|电动| 2010 | 2015 |
| car1|柴油| 2015 | 2017 |
| car2|电动| 2012 | 2013 |
| car2|电动| 2010 | 2017 |
我想删除所有行的范围(即开始_年到结束_年)位于另一行的范围内,具有相同的模型和动力系统(即删除行:2和5)。我尝试了多种方法,但不能让他们工作.
到目前为止,我尝试了这个:
1.创建一个范围变量:test_range <- df_unique %>% rowwise() %>% mutate(years_range = list(start_year:end_year)) %>% ungroup()
1.删除其他变量范围内的行:df2 <- df %>% filter(!sapply(years_range, function(x) any(sapply(df$years_range, function(y) all(x %in% y) & !identical(x, y))))) %>% group_by(model, powertrain, years_range) %>% slice_head() %>% ungroup()

y3bcpkx1

y3bcpkx11#

如果all年包含在另一个序列中,则可以采用outer方法,将:()获得的序列从头到尾进行比较。

> g <- \(x) {
+   if (nrow(x) == 1) {
+     TRUE
+   } else {
+     sqs <- with(x, Map(`:`, start_year, end_year))
+     f <- \(i, j) all(sqs[[i]] %in% sqs[[j]])
+     o <- outer(seq_along(sqs), seq_along(sqs), Vectorize(f))
+     diag(o) <- NA
+     rowSums(o, na.rm=TRUE) != 1
+   }
+ }

字符串
把它放在by中,它沿着定义的by.变量、apply函数和unsplit进行拆分。

> by. <- c("model", "powertrain")
> dat[by(dat, dat[by.], FUN=g) |> unsplit(dat[by.]), ]
  model powertrain start_year end_year
1  car1     diesel       2010     2015
3  car1   electric       2010     2015
4  car1     diesel       2015     2017
6  car2   electric       2010     2017

  • 数据类型:*
> dput(dat)
structure(list(model = c("car1", "car1", "car1", "car1", "car2", 
"car2"), powertrain = c("diesel", "diesel", "electric", "diesel", 
"electric", "electric"), start_year = c(2010L, 2011L, 2010L, 
2015L, 2012L, 2010L), end_year = c(2015L, 2013L, 2015L, 2017L, 
2013L, 2017L)), class = "data.frame", row.names = c(NA, -6L))

相关问题