相关疑难解决方法(0)

动态构建查询多列的调用

如何使用字符向量变量作为参数动态查找多个字段并通过引用添加.在下面的情况下,我想查找两列并删除i.它们中的前缀.当然,他们可以覆盖具有相同名称的现有列.

library(data.table)
set.seed(1)
ID <- data.table(id = 1:3, meta = rep(1,3), key = "id")
JN <- data.table(idd = sample(ID$id, 3, FALSE), value = sample(letters, 3, FALSE), meta = rep(1,3), key = "idd")
select <- c("value","meta") # my fields to lookup
j.lkp <- call(":=", select, lapply(paste0("i.",select), as.symbol))
j.lkp
# `:=`(c("value", "meta"), list(i.value, i.meta))
ID[JN, eval(j.lkp)]
# Error in eval(expr, envir, enclos) : could not find function "i.value"
ID[JN, `:=`(c("value", "meta"), list(i.value, i.meta))]
#    id meta value
# …
Run Code Online (Sandbox Code Playgroud)

lookup r dynamic data.table

11
推荐指数
3
解决办法
386
查看次数

r data.table函数式编程/元编程/计算语言

我正在探索使用data.table包装聚合函数(但实际上它可以是任何类型的函数)的不同方法(也提供了一个dplyr示例)并且想知道关于函数式编程/元编程的最佳实践

  • 性能(实现是否与data.table可能适用的潜在优化有关)
  • 可读性(有一个共同商定的标准,例如在大多数使用data.table的包中)
  • 易于推广(元编程是否具有"推广性"的方式存在差异)

基本应用是灵活地聚合表,即参数化变量以聚合,聚合的维度,两者的相应结果变量名称和聚合函数.我已经在三个data.table和一个dplyr方式中实现了(几乎)相同的功能:

  1. fn_dt_agg1(这里我无法弄清楚如何参数化聚合函数)
  2. fn_dt_agg2(由@jangorecki的回答启发这里,他称之为'上的语言计算’)
  3. fn_dt_agg3(灵感来自@Arun的答案,这似乎是元编程的另一种方法)
  4. fn_df_agg1(我在dplyr中的谦虚态度)

图书馆

library(data.table)
library(dplyr)
Run Code Online (Sandbox Code Playgroud)

数据

n_size <- 1*10^6
sample_metrics <- sample(seq(from = 1, to = 100, by = 1), n_size, rep = T)
sample_dimensions <- sample(letters[10:12], n_size, rep = T)
df <- 
  data.frame(
    a = sample_metrics,
    b = sample_metrics,
    c = sample_dimensions,
    d = sample_dimensions,
    x = sample_metrics,
    y = sample_dimensions,
    stringsAsFactors = F)

dt <- as.data.table(df)
Run Code Online (Sandbox Code Playgroud)

实现

1. fn_dt_agg1

fn_dt_agg1 <- 
  function(dt, metric, metric_name, dimension, dimension_name) { …
Run Code Online (Sandbox Code Playgroud)

functional-programming r metaprogramming dplyr data.table

6
推荐指数
1
解决办法
704
查看次数