当前位置: 首页 > 知识库问答 >
问题:

矩阵函数嵌入dplyr mutate

农飞翔
2023-03-14

我有一个很大的dataframealldata,我正在尝试对其进行一些计算,这些计算以前是在旧版本上进行的,并且是用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中,使用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)
    }
}

共有1个答案

空翼
2023-03-14

matrixstatsweightedd.desc.stat包含您可能需要的许多函数。

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

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

并像以前一样运行脚本。

 类似资料:
  • 从学习利用MATLAB处理矩阵来入手,是入门MATLAB的最好方法!下面就让我们来看看下面这些例子。 输入矩阵有以下几种不同方法: 直接输入组成矩阵的元素。 从外部文件引入矩阵。 利用自带的函数构成矩阵。 利用在*.M文件内自定义的函数来构成矩阵。 下面让我们来输入杜勒的魔方的一组元素,只要遵循下列几个基本步骤就可以了: 用空格或者逗号来区分一行里不同的元素。 用分号';'来区分不同的行。 用方括

  • 问题内容: 任何人都具有可以用以下形式在Java中转置Matrix的功能: 我有这样的功能: 但是在某处是错误的。 问题答案:

  • 问题内容: 我有一些以表示的数据。它是一个未知大小的张量(应分批输入),每个项目的大小都为。经历,所以现在有尺寸,其中是嵌入尺寸并指未知的批量大小。 此处描述: 我现在正尝试将输入数据中的每个样本(现在通过嵌入维度进行扩展)乘以矩阵变量,而我似乎不知道该怎么做。 我首先尝试使用,但是由于形状不匹配而导致错误。然后,我通过扩展的维度和应用来尝试以下操作(我还尝试了从进行的功能,结果相同): 这将通过

  • 我在一个角度项目中使用材料。 除matInput外,我使用的所有材质组件都工作。 我很好地导入了这个组件,我的印象是它被很好地检测到了,但是它的css没有被考虑进去。 _ 在此输入图像描述 垫按钮工作,但垫输入没有。

  • 着色器语言中通过关键字mat2、mat3、mat4分别声明一个2x2矩阵、3x3矩阵、4x4矩阵,通过内置函数mat2()、mat3()、mat4()分别创建一个2x2矩阵、3x3矩阵、4x4矩阵。 关键字 数据类型 mat2 2x2矩阵,4个元素 mat3 3x3矩阵,9个元素 mat4 4x4矩阵,16个元素 声明变量 关键子mat4声明一个4x4矩阵 mat4 matrix4; 构造函数赋

  • 问题内容: 我正在使用Numpy将数据存储到矩阵中。从R背景开始,有一种极其简单的方法将函数应用于矩阵的行/列或两者。 python / numpy组合是否有类似的东西?编写自己的小实现不是问题,但是在我看来,我想出的大多数版本都将比现有的实现效率低得多/占用更多内存。 我想避免从numpy矩阵复制到局部变量等,这可能吗? 我尝试实现的功能主要是简单的比较(例如,某列中有多少个元素小于数字x,或者