dat <- data.frame(id = c(0, 0, 01, 02, 03, 011, 012, 013, 0111, 0112, 0113),
x1 = rnorm(11),
x2 = rnorm(11),
x3 = rnorm(11))
my.df <- data.frame(id = 0, id1 = 01, id2 = 011, id3 = 0111, some.column = 'xyz')
我要使用以下条件从dat
中过滤行:
如果my.df$id3
中存在dat$id
,则过滤dat$id == my.df$id3
,否则不过滤
检查是否存在my.df$id2
并过滤dat$id == my.df$id2
,如果不存在,
检查是否存在my.df$id1
并过滤dat$id == my.df$id1
,如果不存在
只需过滤dat$id == my.df$id
dat %>%
dplyr::filter(ifelse(my.df$id3 %in% id, id == my.df$id3,
ifelse(my.df$id2 %in% id, id == my.df$id2,
ifelse(my.df$id1 %in% id, id == my.df$id1, id == my.df$id))))
它返回空行。
答案 0 :(得分:1)
这是您正在寻找的东西还是您的预期输出是什么样子?在下面的示例中,如果id == my.df$id3
中存在my.df$id3
,则应用过滤器dat$id
。既然是这种情况,则此过滤器仅保留原始数据的一行。
library(dplyr)
dat <- data.frame(id = c(0, 0, 01, 02, 03, 011, 012, 013, 0111, 0112, 0113),
x1 = rnorm(11),
x2 = rnorm(11),
x3 = rnorm(11))
my.df <- data.frame(id = 0, id1 = 01, id2 = 011, id3 = 0111, some.column = 'xyz')
dat %>%
dplyr::filter(if (my.df$id3 %in% id) {
id == my.df$id3
} else if (my.df$id2 %in% id) {
id == my.df$id2
} else if (my.df$id1 %in% id) {
id == my.df$id1 })
#> id x1 x2 x3
#> 1 111 0.3771992 -0.5073165 -0.3555985
由reprex package(v0.3.0)于2020-07-13创建
答案 1 :(得分:0)
您可以按照创建my.df
的顺序提取order_vec
中的列值,过滤其中的值,arrange
并选择第一行。
library(dplyr)
order_vec <- unlist(my.df[c(paste0('id', 3:1), 'id')])
dat %>%
filter(id %in% order_vec) %>%
arrange(match(id, order_vec)) %>%
slice(1L)
# id x1 x2 x3
#1 111 1.5 0.872 0.848