【问题标题】:embedding matrix functions into dplyr mutate将矩阵函数嵌入 dplyr mutate
【发布时间】:2016-10-15 01:38:04
【问题描述】:

我有一个大数据框alldata,我正在尝试进行一些以前在旧版本上完成并用基础 R 编写的计算。我的目标是创建具有输出的新列这些计算使用 dplyr。此代码的先前版本使用了数十个中间数据帧,并使用函数将这些计算写入单独的文件中。

我很好奇是否可以在编写这些函数时保留它们,但将它们嵌入 dplyr 以引用 alldata 中的列,而不是原始版本中的这些临时矩阵。

这是我正在处理的代码的示例部分。正如您在 cmets 中看到的那样,我已将旧的 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 中,其中 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)
    }
}

【问题讨论】:

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

标签: r function matrix dplyr


【解决方案1】:

matrixStatsWeighted.Desc.Stat 包含许多您可能需要的功能。

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

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

并像以前一样运行您的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2020-01-25
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多