我在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").
我想获得一个索引,该索引引用矩阵中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值.
使用VBA我将一个8字节的浮点数从一个字节数组加载到一个Double中.一些数字将是IEEE 754 NaN(即如果您尝试使用Debug.Print打印它,您将看到1.#QNAN).我的问题是,如何测试Double中包含的数据是否是NaN而不是常规数字?
谢谢.
我最近在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)
谢谢.
我正在尝试编写一个 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 实例中。
谢谢。
在C#中,我试图从Process对象获取Excel.Application对象的实例.这看起来应该很简单,但我无法弄明白,也无法找到一个例子.重复一遍,我有一个System.Diagnostics.Process对象,我知道它指的是一个正在运行的Excel实例.我现在需要恢复引用该进程的Microsoft.Office.Interop.Excel.Application对象,以便我可以从C#操作Excel应用程序.
如果它更简单,我还有与活动Excel窗口关联的HWND ID和窗口文本.
谢谢.
在Visiblox图表中使用LinearAxis作为Y轴时,我想强制轴使用给定数量的主刻度线,同时仍然使工具包自动计算轴范围和刻度标记位置.例如,我可能有一个主要和次要Y轴,我希望两个轴使用相同数量的主要刻度,以便它们的水平网格线重叠.这可能吗?
我有一个函数来计算变量的加权平均值,并使用data.table
聚合语法按时间段对其进行分组.但是,我想以编程方式提供加权列的名称.有没有办法在仍然使用传统data.table
语法的同时实现这一目标?wtmean1
下面的函数演示了我想做什么的想法(但它会产生错误).该函数的wtmean2
工作原理受到data.table
FAQ的启发,但传递整个表达式更加麻烦,并且不可能在函数中提取加权列的名称,这可能是必需的.有没有办法开始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) 我试图了解用 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) 我在数据上拟合了回归模型,然后将其用于预测,但训练数据和预测数据中的列名称不同。典型的方法是简单地重命名列,使它们在两个数据集中相同。但是,我想知道是否还有一种方法可以直接修改拟合的 lm 对象中的术语名称,例如x1
可以将术语重命名为x2
,然后我可以在其中调用列的predict(model, data)
地方运行。data
x2