Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于多个具有相似命名结构的列进行筛选_R_Dplyr_Nse - Fatal编程技术网

R 基于多个具有相似命名结构的列进行筛选

R 基于多个具有相似命名结构的列进行筛选,r,dplyr,nse,R,Dplyr,Nse,我想对几个名称相似的列进行筛选mytibble。Specificall我想比较x与x_new,y与y_new等等,但不指定显式名称,而是使用列名称中的结构 我尝试在处使用filter\u,但这不起作用,因为我不知道如何正确计算最后一行中的公式 my_df %>% filter_at(vars(contains("_new")), any_vars(funs({ x <- . x_name <- quo_name(quo(x)) x_new_name

我想对几个名称相似的列进行
筛选
my
tibble
。Specificall我想比较
x
x_new
y
y_new
等等,但不指定显式名称,而是使用列名称中的结构

我尝试在处使用
filter\u,但这不起作用,因为我不知道如何正确计算最后一行中的公式

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%>%
过滤变量(包含(“\u新”)、任何变量(FUN({

x我们可以使用
map
来实现这一点。通过删除列名('nm1')的后缀部分,创建
唯一的
名称的向量。在“nm1”中循环,选择
与列名称匹配的列,
通过检查行是否不相等将其减少为单个逻辑向量,然后
将逻辑向量的
列表减少为单个逻辑向量,并基于此提取行

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    
库(tidyverse)
nm1%
选择_at(变量(匹配项(.x)))%>%
减少(`!=`))%>%
减少(`|`)%>%
magrittr::摘录(my_df,,)
#x x_新y y_新
#     
#1 4 d a
#2 5 1 e

另一个选项是创建一个表达式,然后求值

library(rlang)
nm1 <- names(my_df) %>% 
          split(sub("_.*", "", .)) %>%
          map(~ paste(.x, collapse=" != ") %>%
                   paste0("(", ., ")")) %>%
          reduce(paste, sep = "|")
my_df %>%
   filter(!! parse_expr(nm1))
# 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    
库(rlang)
nm1%
拆分(子(“...*”,“,”)%>%
映射(~paste(.x,collapse=“!=”)%>%
粘贴0(“,”)%>%
减少(粘贴,sep=“|”)
我的_df%>%
过滤器(!!解析表达式(nm1))
#一个tibble:2x4
#x x_新y y_新
#    
#1 4 d a
#2 5 1 e

您有最后一行
粘贴(x_名称,!=”,x_新名称)
哪个没有评估是的,但我如何评估它?我尝试了
评估
!!
,但它不起作用。问题是,我想,评估的环境不清楚……此外,您正在尝试对类似的列进行分组和比较。可能您需要
映射
,但我想知道是否有解决方案使用
filter\u at
或类似工具,但不“退出”管道。@kah如果您检查
quo\u name(quo(x))
的输出,它将返回“x”,而不是列名称。这是真的,但我更改了
x\u名称
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    
library(rlang)
nm1 <- names(my_df) %>% 
          split(sub("_.*", "", .)) %>%
          map(~ paste(.x, collapse=" != ") %>%
                   paste0("(", ., ")")) %>%
          reduce(paste, sep = "|")
my_df %>%
   filter(!! parse_expr(nm1))
# 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