2017-07-31 63 views
1

样本数据:R:数据表组按列名称矢量

set.seed(1) 
dt <- data.table(a = sample(c("a", "b"), 25, replace = T), b = sample(c("c", "d"), 25, replace = T), c = runif(25)) 
nodes <- c("a", "b") 
metric <- "c" 

想法是有分组列作为动态变量。在data.table内传递给by参数的列名的计数未知。

预期输出(通过使用函数内固定名称):

dt[,.(Count = .N, Avg = mean(get(metric))),.(a,b)] 
    a b Count  Avg 
1: a c  4 0.5622371 
2: b c  7 0.4535460 
3: b d  6 0.5033865 
4: a d  8 0.3872618 

去为get()函数只返回节点内的第一个参数对象:

dt[,.(Count = .N, Avg = mean(get(metric))),.(get(nodes))] 
    get Count  Avg 
1: a 12 0.4455869 
2: b 13 0.4765493 

,能够get名一个接一个,并得到正确的结果:

dt[,.(Count = .N, Avg = mean(get(metric))),.(get(nodes[1]), get(nodes[2]))] 
    get get.1 Count  Avg 
1: a  c  4 0.5622371 
2: b  c  7 0.4535460 
3: b  d  6 0.5033865 
4: a  d  8 0.3872618 

但是正如我所说的那样 - 这些变量的数量事先不知道。

+1

你几乎有:'DT [(计数= .N,平均=平均(拿到(公式))),mget(nodes)]' – Roland

+0

你能解释'。(mget(nodes))'和'mget(nodes)'之间的区别吗?我有一种印象,'。(...)'''by''参数的符号应该是一个传递多个参数的简便方法。 –

+0

'.'是'list'的别名。 'mget'已经返回一个列表。 – Roland

回答

2

我们可以指定单独nodes分组变量和列,以获得平均在.SDcols

dt[, .(Count = .N, Avg = mean(.SD[[1]])), by = nodes, .SDcols = metric] 
# a b Count  Avg 
#1: a c  4 0.5622371 
#2: b c  7 0.4535460 
#3: b d  6 0.5033865 
#4: a d  8 0.3872618 
+1

看起来不需要'c'。例如,'e = substitute(。(Count = .N,Avg = mean(metric)),list(metric = as.symbol(metric))); dt [,eval(e),by =节点]' – Frank

+1

@Frank谢谢,不知道更改 – akrun