目前,在尝试不是直接按名称选择列时,而是使用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]
答案 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)]
如果您不想一直输入colnames
和value=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")
宏在评估之前编写代码时功能强大。