小编Abi*_*iel的帖子

如何在R中为自定义S3类编写ac()函数

我在R中编写一个S3类,它只是一个附加了一些属性的整数.如果x1和x2是这个类的对象(称之为"myclass"),那么我希望c(x1,x2)返回myclass对象的向量,原始类定义和属性保持不变.但是,c()的记录行为是删除属性,所以我似乎需要编写自己的c.myclass()方法.我的问题是,我该怎么做?

问题的一个例子:

myclass <- function(x, n) structure(x, class="myclass", n=n)
x1 <- myclass(1, 5)
x2 <- myclass(2, 6)
c(x1, x2)
[1] 1 2
Run Code Online (Sandbox Code Playgroud)

这里的结果只是类numeric的项向量,原来的n属性消失了.

查看各种包的代码,我有时会看到如下代码,其中我们需要保留class属性,但没有别的:

c.myclass <- function(..., recursive = F) {
    structure(c(unlist(lapply(list(...), unclass))), class="myclass")
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我也无法让这个工作.调用c.myclass(x1,x2)的结果是一个向量,其中向量本身具有类"myclass",但是向量中的每个项都有类numeric; 我真的希望向量中的每个项都有类"myclass".在实践中,我还需要升级此方法以保留其他属性(如myclass中的属性"n").

r r-s3

6
推荐指数
2
解决办法
643
查看次数

仅在矩阵列的"中间"获取NAs的位置

我想获得一个索引,该索引引用矩阵中NA值的位置,如果给定单元格是NA并且列中前后至少有一个非NA值,则索引为真.例如,给定以下矩阵

     [,1] [,2] [,3] [,4]
[1,]   NA    1   NA    1
[2,]    1   NA   NA    2
[3,]   NA    2   NA    3
Run Code Online (Sandbox Code Playgroud)

返回TRUE的唯一索引值应为[2,2].

对于我想做的事情,有一个紧凑的表达方式吗?如果必须的话,我可以遍历列并使用类似的东西min(which(!is.na(x[,i])))来查找每列中的第一个非NA值,然后将之前的所有值设置为FALSE(对于max之后的所有值都相同).这样我就不会选择前导和尾随NA值.但这看起来有点混乱,所以我想知道是否有一个更清晰的表达式,没有循环这样做.

编辑要有效,NA值只需要在列中某处之前和之后具有非NA值,但不一定与其相邻.例如,如果列由c(NA,3,NA,NA,NA,4,NA)定义,我想要找到的NA将是位置3,4和5的那些,因为它们被包围在非NA值.

r

6
推荐指数
1
解决办法
6479
查看次数

在VBA/VB6中测试NaN

使用VBA我将一个8字节的浮点数从一个字节数组加载到一个Double中.一些数字将是IEEE 754 NaN(即如果您尝试使用Debug.Print打印它,您将看到1.#QNAN).我的问题是,如何测试Double中包含的数据是否是NaN而不是常规数字?

谢谢.

vb6 vba

5
推荐指数
1
解决办法
4167
查看次数

r中矩阵累积标准差的有效计算

我最近在r-help邮件列表上发布了这个问题,但没有得到答案,所以我想我也会在这里发布,看看是否有任何建议.

我试图计算矩阵的累积标准差.我想要一个接受矩阵并返回相同大小的矩阵的函数,其中输出单元格(i,j)被设置为行1和i之间的输入列j的标准偏差.应忽略NA,除非输入矩阵本身的单元(i,j)是NA,在这种情况下,输出矩阵的单元(i,j)也应该是NA.

我找不到内置函数,所以我实现了以下代码.不幸的是,这使用的循环对于大型矩阵来说有点慢.是否有更快的内置功能或有人建议更好的方法?

cumsd <- function(mat)
{
    retval <- mat*NA
    for (i in 2:nrow(mat)) retval[i,] <- sd(mat[1:i,], na.rm=T)
    retval[is.na(mat)] <- NA
    retval
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

statistics r

5
推荐指数
1
解决办法
2297
查看次数

从 Python 获取活动 Excel 工作簿的名称

我正在尝试编写一个 Python 脚本,该脚本将使用 Excel COM 接口访问和修改活动的 Excel 工作簿。但是,当有多个 Excel 实例正在运行时,我很难让它工作。例如,代码

import win32com.client

xl = win32com.client.Dispatch("Excel.Application")
print(xl.ActiveWorkbook.FullName)
Run Code Online (Sandbox Code Playgroud)

仅从 Excel 的第一个运行实例中打印出活动工作簿的名称。我真正想要的是我上次单击的工作簿,无论它在哪个 Excel 实例中。

谢谢。

python com

5
推荐指数
1
解决办法
9683
查看次数

从Process获取Excel.Application对象或在.NET中获取hwnd

在C#中,我试图从Process对象获取Excel.Application对象的实例.这看起来应该很简单,但我无法弄明白,也无法找到一个例子.重复一遍,我有一个System.Diagnostics.Process对象,我知道它指的是一个正在运行的Excel实例.我现在需要恢复引用该进程的Microsoft.Office.Interop.Excel.Application对象,以便我可以从C#操作Excel应用程序.

如果它更简单,我还有与活动Excel窗口关联的HWND ID和窗口文本.

谢谢.

c# excel

5
推荐指数
1
解决办法
2万
查看次数

强制轴在Visiblox图表中使用给定数量的主刻度线

在Visiblox图表中使用LinearAxis作为Y轴时,我想强制轴使用给定数量的主刻度线,同时仍然使工具包自动计算轴范围和刻度标记位置.例如,我可能有一个主要和次要Y轴,我希望两个轴使用相同数量的主要刻度,以便它们的水平网格线重叠.这可能吗?

c# visiblox

5
推荐指数
1
解决办法
1687
查看次数

将参数传递给data.table聚合函数

我有一个函数来计算变量的加权平均值,并使用data.table聚合语法按时间段对其进行分组.但是,我想以编程方式提供加权列的名称.有没有办法在仍然使用传统data.table语法的同时实现这一目标?wtmean1下面的函数演示了我想做什么的想法(但它会产生错误).该函数的wtmean2工作原理受到data.tableFAQ的启发,但传递整个表达式更加麻烦,并且不可能在函数中提取加权列的名称,这可能是必需的.有没有办法开始wtmean1工作,我传入的唯一参数是字符串中加权列的名称?

wtmean1 <- function(dt1, weight) {
  dt1[,weighted.mean(x, weight), by=timeperiod]
}

wtmean2 <- function(dt1, expr) {
  dt1[,eval(substitute(expr)), by=timeperiod]
}

mydata <- data.table(x=1:10, timeperiod=rep(1:2,5), wt1=rnorm(10), wt2=rnorm(10))
wtmean1(mydata, "wt1") # ERROR
wtmean2(mydata, weighted.mean(x, wt2))
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
884
查看次数

RcppArmadillo 和 Armadillo 的性能差异

我试图了解用 RcppArmadillo 编写的函数和使用 Armadillo 库用独立 C++ 程序编写的函数之间的性能差异。例如,考虑以下使用传统教科书公式计算线性模型系数的简单函数。

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>

using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
void simpleLm(NumericMatrix Xr, NumericMatrix yr) {
   int n = Xr.nrow(), k = Xr.ncol();
   mat X(Xr.begin(), n, k, false);
   colvec y(yr.begin(), yr.nrow(), false);

   colvec coef = inv(X.t()*X)*X.t()*y;
}
Run Code Online (Sandbox Code Playgroud)

这需要大约 6 秒来运行一个1000000x100矩阵X。代码中的一些时间(未显示)表明所有时间都花在coef计算上。

X <- matrix(rnorm(1000000*100), ncol=100)
y <- matrix(rep(1, 1000000))
system.time(simpleLm(X,y))

 user  system elapsed 
  6.028   0.009   6.040
Run Code Online (Sandbox Code Playgroud)

现在考虑一个用 C++ 编写的非常相似的函数,然后使用g++.

#include <iostream>
#include <armadillo>
#include …
Run Code Online (Sandbox Code Playgroud)

r rcpp

5
推荐指数
1
解决办法
981
查看次数

重命名 lm 对象中的模型项以进行预测

我在数据上拟合了回归模型,然后将其用于预测,但训练数据和预测数据中的列名称不同。典型的方法是简单地重命名列,使它们在两个数据集中相同。但是,我想知道是否还有一种方法可以直接修改拟合的 lm 对象中的术语名称,例如x1可以将术语重命名为x2,然后我可以在其中调用列的predict(model, data)地方运行。datax2

r

5
推荐指数
0
解决办法
1037
查看次数

标签 统计

r ×6

c# ×2

com ×1

data.table ×1

excel ×1

python ×1

r-s3 ×1

rcpp ×1

statistics ×1

vb6 ×1

vba ×1

visiblox ×1