在下面的示例中,我有一个函数(@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]
答案 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