我正在为特定问题开发自定义引导算法,因为我想要大量的重复,我确实关心性能.在这方面,我对如何正确使用runif有一些疑问.我知道我自己可以运行基准测试,但C++优化往往很难,我也想了解任何差异的原因.
第一个问题:
第一个代码块是否比第二个更快?
for (int i = 0; i < n_boot; i++) {
new_random = runif(n); //new_random is pre-allocated in class
// do something with the random numbers
}
Run Code Online (Sandbox Code Playgroud)
for (int i = 0; i < n_boot; i++) {
NumericVector new_random = runif(n);
// do something with the random numbers
}
Run Code Online (Sandbox Code Playgroud)
它可能归结为runif是填充左侧还是分配并传递新的NumericVector.
第二个问题:
如果两个版本都分配了一个新的向量,我可以通过在标量模式下一次生成一个随机数来改进吗?
如果您想知道,内存分配占用了我处理时间的相当大一部分.通过优化其他不必要的内存分配,我将运行时间减少了30%,因此它很重要.
我有一个data.frame看起来像这样:
Name Age Gender Team
John 18 M A
Luke 75 M B
Dean 20 M C
Zoe 34 F B
Chloe 12 F B
Erik 56 M A
Run Code Online (Sandbox Code Playgroud)
我想计算一个新的值(TeamType)对于团队的所有成员都是一样的,但取决于团队中的人.
例如,团队B M和团队中的两个F团队都将拥有,TeamType=Mixed而团队C和A将是OnlyM,如下所示:
Name Age Gender Team TeamType
John 18 M A OnlyM
Luke 75 M B Mixed
Dean 20 M C OnlyM
Zoe 34 F B Mixed
Chloe 12 F B Mixed
Erik 56 M A OnlyM
Run Code Online (Sandbox Code Playgroud)
这在Python或许多其他传统语言中很容易做到,但我无法弄清楚如何在R中做到这一点.
将.csv文件导入R 时出现问题.我的代码:
t <- read.csv("C:\\N0_07312014.CSV", na.string=c("","null","NaN","X"),
header=T, stringsAsFactors=FALSE,check.names=F)
Run Code Online (Sandbox Code Playgroud)
R报告错误并且不按我的意愿执行操作:
Error in read.table(file = file, header = header, sep = sep, quote = quote, :
more columns than column names
Run Code Online (Sandbox Code Playgroud)
我想问题是因为我的数据格式不正确.我只需要来自的数据[,1:32].应删除所有其他人.
可从以下网址下载数据:https: //drive.google.com/file/d/0B86_a8ltyoL3VXJYM3NVdmNPMUU/edit?usp =sharing
非常感谢!
我在R中运行回归,当试图适应abline绘图时没有任何反应,没有出现错误信息.
我必须记录转换数据,所以我想知道这是否是问题?数据不是正常分布的,但我们仍然被要求执行回归.
这是我到目前为止所尝试的:
alldata<-read.csv(file.choose(),header=T)
attach(alldata)
plot(weight.g,wingspan.mm,log="xy")
abline(lm(wingspan.mm~weight.g))
fit1<-lm(wingspan.mm~weight.g)
> summary(fit1)
fit2<-lm(log(wingspan.mm)~log(weight.g))
plot(fit2)
plot(weight.g,wingspan.mm,log="xy")
abline(fit2)
abline(lm(log(wingspan.mm)~log(weight.g)))
Run Code Online (Sandbox Code Playgroud)
谁能发现我哪里错了?
谢谢,凯特
我想计算一个简单的总和,但不是从1到我在sum函数中放入的值,而是我希望它总结,就像我通常在数学中所做的那样,我有一个表达式有一些变量,我然后从1:4改变,然后R假设将表达式值相加.
喜欢
y = function(x) x**2
sum(y(x),x=3:5) = 3^2+4^2+5^2
Run Code Online (Sandbox Code Playgroud)
我如何在R中执行此操作?
我有一个程序,我需要X(nRow, nCol, nSlice)在Rcpp中重复计算每个立方体切片的列平均值,结果意味着形成一个矩阵M(nCol, nSlice).以下代码产生错误:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
mat cubeMeans(arma::cube X){
int nSlice = X.n_slices;
int nCol = X.n_cols;
int nRow = X.n_rows;
arma::vec Vtmp(nCol);
arma::mat Mtmp(nRow, nCol);
arma::mat Means(nCol, nSlice);
for (int i = 0; i < nSlice; i++){
Mtmp = X.slice(i);
for(int j = 0; j < nCol; j++){
Vtmp(j) = sum(Mtmp.col(j))/nRow;
}
Means.col(i) = Vtmp;
}
return(wrap(Means));
}
Run Code Online (Sandbox Code Playgroud)
'/Rcpp/internal/Exporter.h:31:31:错误:没有匹配函数来调用'arma :: Cube :: Cube(SEXPREC*&)'
我无法弄明白.当函数的输入是一个矩阵(并返回一个向量)时,我没有得到错误.但是,我将上述功能作为主程序的一部分包括在内
#include …Run Code Online (Sandbox Code Playgroud) fastLm()比...慢得多lm().基本上,我只是打电话lm()和fastLm()使用相同的公式和数据,但fastLm()似乎要慢得多lm().这可能吗?我只是不知道这怎么可能发生?
dim(dat)
#[1] 87462 90
##
library(Rcpp)
library(RcppEigen)
library(rbenchmark)
benchmark(fastLm(formula(mez),data=dat),lm(formula(mez),data=dat))
test replications elapsed relative user.self sys.self user.child sys.child
1 fastLm(formula(mez), data = dat) 100 195.81 7.079 189.36 6.27 NA NA
2 lm(formula(mez), data = dat) 100 27.66 1.000 24.52 3.02 NA NA
summary(mez)
Call: lm(formula = totalActualVal ~ township + I(TotalFinishedSF^2) +
mainfloorSF + nbrFullBaths + township + range + qualityCodeDscr +
TotalFinishedSF:range + nbrBedRoom + PCT_HISP, data = …Run Code Online (Sandbox Code Playgroud) 在R中,我们可以使用唯一方法来查找唯一行
> data <- matrix(c(1,1,0,1,1,1,0,1),ncol = 2)
> data
[,1] [,2]
[1,] 1 1
[2,] 1 1
[3,] 0 0
[4,] 1 1
> unique(data)
[,1] [,2]
[1,] 1 1
[2,] 0 0
Run Code Online (Sandbox Code Playgroud)
我们怎样才能arma::mat在Rcpp中做到这一点?这里唯一函数返回唯一元素而不是唯一行.
我正在为 N(0,1) 分布编写 Metropolis-Hastings 算法:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector metropolis(int R, double b, double x0){
NumericVector y(R);
y(1) = x0;
for(int i=1; i<R; ++i){
y(i) = y(i-1);
double xs = y(i)+runif(1, -b,b)[0];
double a = dnorm(xs, 0, 1)[0]/dnorm(y(i), 0, 1)[0];
NumericVector A(2);
A(0) = 1;
A(1) = a;
double random = runif(1)[0];
if(random <= min(A)){
y[i] = xs;
}
}
return y;
}
Run Code Online (Sandbox Code Playgroud)
但每次我尝试编译该函数时,都会出现此错误:
第 12 行:没有匹配的函数来调用“dnorm4”
我尝试使用 dnorm 编写一个简单的函数,例如
NumericVector den(NumericVector y, double a, double …Run Code Online (Sandbox Code Playgroud) 我想用二进制值创建一个新列(df_one $ acceslane).if df_one$direction == df_two$direction和if df_one$location和df_two$location几乎相同( - >参见嵌套for循环中的Distance)它应该是1.
df_one:
direction | location | acceslane
L | 12.3 | NA
R | 14.8 | NA
Run Code Online (Sandbox Code Playgroud)
df_two:
direction | location
L | 12.5
R | 145.0
for (i in 1:nrow(df_one)) {
for (j in 1:nrow(df_two)) {
Distance <- seq(df_two[j, 2]-.5, df_two[j, 2]+.5, by = .1)
if ((x[i, 1] == df_two[j, 1]) & (x[i, 2] %in% Distance)){
df_one[i, 3] <- 1
break}
else{df_one[i, 3] <- 0} …Run Code Online (Sandbox Code Playgroud)