【发布时间】: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)
}
我纠结的是:
-
如何过滤包含两个(或更多?)字符串的列,即
var1和min?我尝试使用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 你说得对,我只是不想把整个画面都搞砸。