我有一个大型数据框alldata
,我试图做一些以前在旧版本上完成并用基础R编写的计算。我的目标是创建新列使用dplyr进行这些计算的输出。此代码的先前版本使用了数十个中间数据帧,并使用函数将这些计算写入单独的文件中。
我很好奇是否可以在编写时保留这些函数,但是将它们嵌入到dplyr中以引用alldata
中的列而不是原始版本中的这些临时矩阵。
以下是我正在处理的代码的示例部分。正如您在评论中看到的那样,我已将旧的R代码翻译成dplyr以获得简单的加权平均函数。
d_weighted = alldata %>%
# equivalent to by = list(regspp = data$regspp[inds]) from old code
group_by(regspp, year) %>%
# equivalent to wgtmean = function(x, na.rm=FALSE) wtd.mean(x=x[,1], weights=x[,2], na.rm=na.rm) from old code
mutate(lat_wgtmean = wtd.mean(x=lat, weights=wtcpue, na.rm=FALSE))
但是,由于函数比wgtmean
更复杂,我希望按原样包含函数。
旧代码中的下一个函数计算矩阵的加权标准差,其中第一列由值和第二列组成:
wgtsd = function(mat, ...){
x = mat[,1][mat[,2]>0] # trim to values with weight > 0
w = mat[,2][mat[,2]>0]
sqrt(wtd.var(x=x, weights=w, ...))
}
是否可以在dplyr :: mutate中嵌入此函数,其值为lat
(纬度),权重= wtcpue
(每单位努力捕获,转换为权重)以创建新列alldata
包含加权标准偏差?
我知道我可以重写这些功能,但是我不想在文本后面对更复杂的功能这样做(请参阅下面的例子),如果有的话,我很好奇使用dplyr将函数与矩阵参数集成的优雅解决方案。
wgtskew = function(mat, na.rm=FALSE){
x = mat[,1][mat[,2]>0] # trim to values with weight > 0
w = mat[,2][mat[,2]>0]
if(na.rm){
s = !is.na(x+w)
x = x[s]
w = w[s]
}
n = length(x)
w = n * w / sum(w) # normalize
if(n>2){
c3 = n / ((n - 1) * (n - 2))
sdv = wgtsd(cbind(x, w), normwt = TRUE, na.rm = na.rm)
xbar = wtd.mean(x, w, na.rm = na.rm)
sk = c3 * sum(w ^ (3 / 2) * ((x - xbar) / sdv) ^ 3)
return(sk)
} else {
return(NA)
}
}
答案 0 :(得分:0)
包matrixStats
和Weighted.Desc.Stat
包含您可能需要的许多功能。
然后,您可以使用文本编辑器查找和替换,或者,例如:
wgtsd <- function(...) matrixStats::weightedSd(...)
并像以前一样运行脚本。