【问题标题】:R multiple regular expressions, dataframe column namesR多个正则表达式,数据框列名
【发布时间】:2022-01-21 16:50:36
【问题描述】:

我有一个数据框data,其中有很多列,格式为

  ...v1...min ...v1...max ...v2...min ...v2...max
1       a           a           a           a
2       b           b           b           b
3       c           c           c           c

...的地方可以有任何表达。

我想创建一个接受三个参数的函数createData

  • X:一个数据框,

  • cols:包含列第一部分的向量,即c("v1", "v2")

  • fun:包含列第二部分的向量,即c("min"),或c("max", "min")

并返回过滤后的数据框,例如:

createData(X, c("v1"), None) 会返回这种数据框:

  ...v1...min ...v1...max 
1       a           a    
2       b           b  
3       c           c 

createData(X, c("v1", "v2"), c("min")) 会给我

  ...v1...min ...v2...min 
1       a           a    
2       b           b  
3       c           c 

此时我决定我需要使用来自dplyr 包的select(contains())

createData <- function(data, fun, cols)
{
  X %>% select(contains())
  return(X)
}

我纠结的是:

  • 如何过滤包含两个(或更多?)字符串的列,即var1min?我尝试使用data[grepl(".*(v1*min|min*v1).*", colnames(data), ignore.case=TRUE)],但它似乎不起作用,而且我的表达方式也不固定 - 它们取决于我传递的向量,

  • 如何过滤多个具有不同名称的列,即c("v1", "v2"),在向量中传递?以及如何与第一个问题结合起来?

我真的不需要坚持使用dplyr 包,这只是为了示例。谢谢!

编辑

一个可重现的例子:

data = data.frame(AXv1c2min = c(1,2,3),
           subv1trwmax = c(4,5,6),
           ss25v2xxmin = c(7,8,9),
           cwfv2urttmmax = c(10,11,12))

【问题讨论】:

  • 如果我们想传递一个正则表达式,你可能需要matches。最好提供一个可重现的示例,即没有...
  • @akrun 你说得对,我只是不想把整个画面都搞砸。

标签: r dataframe filter


【解决方案1】:

如果您将向量传递给contains,它将像 OR 标记一样发挥作用,而多个 select 语句将产生累加效应。因此,对于您的 esample 数据:

我们可以像这样过滤(v1 OR v2) AND min

library(tidyverse)

data %>%
    select(contains(c('v1','v2'))) %>%
    select(contains('min'))

  AXv1c2min ss25v2xxmin
1         1           7
2         2           8
3         3           9

所以作为一个函数,其中任何一个参数都是可选的:

createData <- function(data, fun=NULL, cols=NULL) {
    if (!is.null(fun)) data <- select(data, contains(fun))
    if (!is.null(cols)) data <- select(data, contains(cols))
    return(data)
}

一系列例子:

createData(data, cols=c('v1', 'v2'), fun='min')
  AXv1c2min ss25v2xxmin
1         1           7
2         2           8
3         3           9

createData(data, cols=c('v1'))
  AXv1c2min subv1trwmax
1         1           4
2         2           5
3         3           6

createData(data, fun=c('min'))
  AXv1c2min ss25v2xxmin
1         1           7
2         2           8
3         3           9

createData(data, cols=c('v1'), fun=c('min', 'max'))
  AXv1c2min subv1trwmax
1         1           4
2         2           5
3         3           6

createData(data, cols=c('v1'), fun=c('max'))
  subv1trwmax
1           4
2           5
3           6

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2021-04-10
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多