按模式引用data.table列

时间:2016-05-22 03:26:29

标签: regex r data.table

我正在尝试使用函数绘制共享列名模式的多个数据表。以下是两个示例表:

dt1 = data.table(date=seq(as.Date("2015/06/20"), as.Date("2015/06/29"), by= "day"),
             ppp_min = rnorm(10), ppp_mean = rnorm(10), ppp_max = rnorm(10))
dt2 = data.table(date=seq(as.Date("2015/06/20"), as.Date("2015/06/29"), by= "day"),
             qqq_min = rnorm(10), qqq_mean = rnorm(10), qqq_max = rnorm(10))

示例图功能:

plt <- function(dt,code) {
min <- paste(code, '_min',sep='')
plot(dt$date, dt[,get(min)])
}
plt(dt1,ppp)
plt(dt2,qqq)

该功能允许指定要绘制的数据表。函数中的“代码”用于应用相关标题和写入文件名,但巧合地匹配列名中的变量。这是Get columns by string from data.table

的应用

我的问题是:是否可以进行模式匹配?我尝试使用grep并按照问题pass column name in data.table using variable in R

中的建议应用eval()quote()来执行此操作

我尝试过这样的事情:

plot(dt$date, dt[,grep("min",names(dt))])

我尝试模式匹配的原因是我有多个colnames我在绘图,第一个解决方案似乎是递归的。在这种情况下,“代码”匹配变量,但如果没有,我还想模式匹配?

由于

2 个答案:

答案 0 :(得分:1)

弗兰克建议的回答是最直接的。它经过测试,能够绘制出具有更高复杂度并且工作的大数据表!可以使用与样本表一起使用的简化函数。

plt <- function(dt,code) {
plot(dt$date, dt[[grep("min",names(dt))]])
}
plt(dt1,ppp)
plt(dt2,qqq)

答案 1 :(得分:0)

使用数据表%like%功能可以获得您想要的功能而无需创建功能。根据您所寻找的内容,有以下几种选择:

plot(dt1[,.SD, .SDcols=names(dt1) %like% "date|_min$"])

dt1[,lapply(.SD, plot, date), .SDcols=names(dt1) %like% "_min$"]

code <- c("ppp", "qqq")
plot(dt1[,.SD, .SDcols=names(dt1) %like% sprintf("date|(%s)_min$", paste(code, collapse="|"))])