Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将矩阵函数嵌入dplyr变异_R_Function_Matrix_Dplyr - Fatal编程技术网

将矩阵函数嵌入dplyr变异

将矩阵函数嵌入dplyr变异,r,function,matrix,dplyr,R,Function,Matrix,Dplyr,我有一个很大的数据框,alldata,我正在尝试对它进行一些以前在旧版本中使用base R编写的计算。我的目标是使用dplyr创建具有这些计算输出的新列。此代码的早期版本使用了几十个中间数据帧,并使用函数将这些计算结果写入单独的文件中 我很好奇是否可以在编写这些函数时保留它们,但将它们嵌入dplyr以引用alldata中的列,而不是原始版本中的这些临时矩阵 下面是我正在处理的代码的一个示例部分。正如您在评论中所看到的,我已经将旧的R代码转换为简单加权平均函数的dplyr d_weighted =

我有一个很大的数据框,
alldata
,我正在尝试对它进行一些以前在旧版本中使用base 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 with value=
lat
(纬度)和weight=
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)
    }
}
包和包含许多您可能需要的函数

然后,您可以使用文本编辑器查找和替换,或者,例如:

wgtsd <- function(...) matrixStats::weightedSd(...)
wgtsd包含包,并包含许多您可能需要的函数

然后,您可以使用文本编辑器查找和替换,或者,例如:

wgtsd <- function(...) matrixStats::weightedSd(...)

wgtsd替代函数是可接受的答案吗?在家酿造自己的加权标准差函数似乎不是一个好主意。当然!不过,我对R中的统计函数不太熟悉,所以我不知道如何找到最终实现与这些函数(当然是自制的)完全相同的数学输出的函数。替代函数是可以接受的答案吗?在家酿造自己的加权标准差函数似乎不是一个好主意。当然!不过,我对R中的统计函数不太熟悉,所以我不知道如何找到最终实现与这些函数(当然是自制的)完全相同的数学输出的函数。