我有一個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: 包含列的第二部分的向量,因此 iec("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
在這一點上,我決定我需要使用 ie select(contains())from dplyrpackage。
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))
uj5u.com熱心網友回復:
如果將向量傳遞給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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417957.html
標籤:
