选择具有类似grep的部分匹配的data.table列

时间:2017-03-24 12:48:35

标签: r data.table

目前,在尝试不是直接按名称选择列时,而是使用grepl时,必须使用data.table命令中的grepl添加额外调用colnames()。是否可以直接将此功能实现到data.table中,以便可以直接使用grepl,并且可以从当前data.table中自动获取列名称。

dt <- structure(list(Global.Company.Key = c(1380L, 1380L, 1380L, 1380L, 1380L)
                         , Calendar.Data.Year.and.Quarter = structure(c(2000, 2000, 2000, 2000, 2000), class = "yearqtr")
                         , Current.Assets.Total = c(2218, 2218, 2218, 2218, 2218)
                         , DRILL_TYPE = c("U", "D", "V", "H", "U")
                         , DI.Oil.Prod.Quarter = c(18395.6792379842, 1301949.24041659, 235.311086392291, 27261.8049684835, 4719.27956989249)
                         , DI.Gas.Prod.Quarter = c(1600471.27107983, 4882347.22928982, 2611.60215053765, 9634.76418242493, 27648.276603634)), .Names = c("Global.Company.Key", "Calendar.Data.Year.and.Quarter", "Current.Assets.Total", "DRILL_TYPE", "DI.Oil.Prod.Quarter",  "DI.Gas.Prod.Quarter"), row.names = c(NA, -5L), class = c("data.table",  "data.frame"), sorted = c("Global.Company.Key",  "Calendar.Data.Year.and.Quarter"))

基于grepl的选择的一个示例:

dt[, grepl(glob2rx("Current.Assets*"), colnames(dt)), with = FALSE]

如果这样的事情可能会成为可能,那就太好了:

dt[, grepl(glob2rx("Current.Assets*")), with = FALSE]

1 个答案:

答案 0 :(得分:2)

library(data.table)

dt <- data.table(CurrentAssets=rnorm(10),FixedAssets=rnorm(10), CurrentLiabilities=rnorm(10),Capital=rnorm(10))

DT

##    CurrentAssets FixedAssets CurrentLiabilities    Capital
## 1:   -1.27610992  -0.2989316         0.20688252  0.6504636
## 2:    0.01065576   1.3088539         1.22533006  0.7550024
## 3:    0.53308022  -1.3459419        -0.99627142 -0.7589336
## 4:    0.30737237  -0.4291044         2.20328357  0.2157515
## 5:   -1.37391990   0.8581097        -0.08161687  0.7067757
## 6:    0.28664468   0.2308479         0.38675487 -0.3467660
## 7:   -0.22902454   1.3365470         0.10128697  0.3246363
## 8:    0.05159736  -2.0702850         0.78404464 -1.7612696
## 9:    0.51817847  -0.8365225        -0.04778573  0.6170114
##10:    0.50859575   0.5683021        -0.13780167 -0.9243434

只是一些随机列。帐户不平衡。 您可以定义列,然后执行...

colnames <- c("CurrentAssets","FixedAssets", "CurrentLiabilities","Capital") dt[,.SD,.SDcols=grep("Assets",colnames,value =TRUE)]

如果您不想一直输入colnamesvalue=TRUE,您可以构建自己的功能,如下所示。

mygrep <- function(x){ colnames <- c("CurrentAssets","FixedAssets", "CurrentLiabilities","Capital") grep(x,colnames,value=TRUE) }

现在mygrep的缺点是你需要手动输入列名。改进是将data.table传递给函数。

mygrep <- function(x,dt){ colnames <- colnames(dt) grep(x,colnames,value=TRUE) }

dt[,.SD,.SDcols=mygrep("Assets",dt)]

修改 刚刚找到了另一种在R中使用宏做同样事情的方法。你需要使用包gtools来使用宏。

我们定义了一个宏subdt

library(gtools) subdt <- defmacro(dt,pattern,expr={ dt[,.SD,.SDcols=grep(pattern,colnames(dt),value=TRUE)] })

然后做

subdt(dt,"Assets")

宏在评估之前编写代码时功能强大。