【问题标题】:Referencing a data.table column by pattern按模式引用 data.table 列
【发布时间】:2016-05-22 03:26:28
【问题描述】:

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

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 我正在绘制并且第一个解决方案似乎是递归的。在这种情况下,“代码”与变量匹配,但如果它不匹配,我仍想进行模式匹配怎么办?

谢谢

【问题讨论】:

  • 也许plt &lt;- function(dt, code) { plot(dt$date, unlist(dt[, paste0(code, '_min'), with = FALSE])) } ; plt(dt1, 'ppp') ; plt(dt2, 'qqq')
  • 我认为唯一的问题是缺少 with=FALSE (显示在 alistaire 的评论中)。或者,[[ 喜欢 plt = function(dt) plot(dt$date, dt[[grep("min",names(dt))]])
  • 您知道您也可以在“data.table”中的[ 中使用plot,对吧?喜欢dt1[, plot(.SD), .SDcols = c("date", grep("min", names(dt1), value = TRUE))]
  • @Frank,您的建议似乎是解决方案。我曾尝试过这种变化,但不知何故错过了这个应用程序。它回答了这个问题谢谢!我会发布解决方案。

标签: regex r data.table


【解决方案1】:

使用数据表%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="|"))])

【讨论】:

    【解决方案2】:

    弗兰克建议的答案是最直接的。它经过测试以绘制具有更高复杂性的大型数据表并且有效!下面是适用于示例表的简化函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-06-26
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多