使用。()/ list和by进行聚合时,返回data.table中的多列

时间:2020-10-21 17:47:40

标签: r data.table

在下面的示例中,我有一个函数(@Pipe({ name: 'filter', pure: false }) export class FilterPipe implements PipeTransform { transform(items: Array<any>, filter: {[key: string]: any }): Array<any> { return items.filter(item => { let matches = Object.keys(filter).every(f => { return filter[f] === 'All' || item[f] == filter[f]; }) return matches; }) } } ),该函数返回向量的均值,并且还可以选择返回标准差。当结合meansd[.data.table.中的list / j语法时,理想的结果长期存在,但在度量上却很宽泛(例如函数返回的sd和sd),如by结果所示。

是否可以从类似于dcast的{​​{1}}调用中直接获得dcast调用的结果(因此跳过dcast步骤)?还是上一个示例(结合转置和by)的错误意味着我不走运?

[.data.table

我尝试过的一些相关事情:

a[, .(meansd(var1, T), meansd(var1, T)), by = bvar]

1 个答案:

答案 0 :(得分:1)

如果将对meansd的两个调用连接到一个向量中,然后然后对其进行转置,则会得到4个单独的列。

然后,您只需要通过重命名列来进行清理:

library('data.table')

a = data.table(var1 = c(1,2,3,10,123,12,31,4,6,2), bvar = 1:2)

meansd = function(x, sd = TRUE){
  if(!sd) return(mean(x))
  return(list(mean = mean(x), sd = sd(x)))
}

a = a[, t(c(meansd(var1, TRUE), meansd(var1, TRUE))), by=bvar]
colnames(a) = c("bvar", "V1_mean", "V1_sd", "V2_mean", "V2_sd")

a
#>    bvar V1_mean     V1_sd V2_mean     V2_sd
#> 1:    1    32.8 51.857497    32.8 51.857497
#> 2:    2     6.0  4.690416     6.0  4.690416
相关问题