我想tibble
我的x
在几个名称相似的列上。具体而言,我希望将x_new
与y
,y_new
与filter_at
进行比较等等,但不指定显式名称,而是使用列名称中的结构。
我尝试使用my_df %>%
filter_at(vars(contains("_new")), any_vars(funs({
x <- .
x_name <- quo_name(quo(x))
x_new_name <- str_replace(x_name, "_new", "")
paste(x_name, "!=", x_new_name)
})
))
,但这不起作用,因为我不知道如何正确评估最后一行中的公式。
my_df <- tibble(x = 1:5,
x_new = c(1:4, 1),
y = letters[1:5],
y_new = c(letters[1:3], "a", "e"))
# A tibble: 5 x 4
# x x_new y y_new
# <int> <dbl> <chr> <chr>
# 1 1 1. a a
# 2 2 2. b b
# 3 3 3. c c
# 4 4 4. d a
# 5 5 1. e e
数据
# A tibble: 2 x 4
# x x_new y y_new
# <int> <dbl> <chr> <chr>
# 1 4 4. d a
# 2 5 1. e e
预期输出
wget
答案 0 :(得分:2)
我们可以使用map
执行此操作。通过删除列名称的后缀部分('nm1')创建unique
名称的向量。循环遍历'nm1',通过检查行是否相等,选择matches
列名称reduce
到单个逻辑向量的列,然后reduce
{{1}逻辑向量到单个逻辑向量,list
基于那个
extract
另一种选择是创建表达式然后评估
library(tidyverse)
nm1 <- unique(sub("_.*", "", names(my_df)))
map(nm1, ~ my_df %>%
select_at(vars(matches(.x))) %>%
reduce(`!=`)) %>%
reduce(`|`) %>%
magrittr::extract(my_df, ., )
# x x_new y y_new
# <int> <dbl> <chr> <chr>
#1 4 4 d a
#2 5 1 e e