我正在做一些小的计算,我决定在data.table
内填充数据,因为它比data.frame
和rbind
基本上我的代码是这样的:
df
是计算中使用的data.frame
,但重要的是它包含的内容。
l=12000
dti = 1
dt = data.table(ni = 0, nj = 0, regerr = 0)
for (i in seq(1,12000,200)) {
for (j in seq(1, 12000, 200)) {
for (ind in 1:nrow(df)) {
if( i+j >= l/2 ){
df[ind,]$X = df[ind,]$pos * 2
} else {
df[ind,]$X = df[ind,]$pos/l
}
}
for (i in 1:100) { # 100 sample
sample(df$X,nrow(df), replace=FALSE)
fit=lm(X ~ gx, df) #linear regression calculation
regerror=sum(residuals(fit)^2)
print(paste(i,j,regerror))
set(dt,dti,1L,as.double(i))
set(dt,dti,2L,as.double(j))
set(dt,dti,3L,regerror)
dti=dti+1
}
}
}
代码打印前几轮print(paste(i,j,regerror))
,然后退出并出现此错误:
*** caught segfault ***
address 0x3ff00008, cause 'memory not mapped'
Segmentation fault (core dumped)
修改 的
structure(list(ax = c(-0.0242214, 0.19770304, 0.01587302, -0.0374415,
0.05079826, 0.12209738), gx = c(-0.3913043, -0.0242214, -0.4259067,
-0.725, -0.0374415, 0.01587302), pos = c(11222, 13564, 16532,
12543, 12534, 14354)), .Names = c("ax", "gx", "pos"), row.names = c(NA,
-6L), class = "data.frame")
任何想法都表示赞赏。
答案 0 :(得分:4)
没有意义听起来很粗鲁,我想你可能会在继续学习之前阅读一些R教程。由于过于本地化,这个问题很可能也会被关闭。此外,seg faults
几乎总是某个地方的错误,但你可以通过了解每个代码的作用来避免一堆这样的问题。从星期五开始,让我们来看看其中的一些内容:
if( i+j >= l/2 ){
data[ind,]$X = df[ind,]$pos * 2
}
else{
data[ind,]$X = df[ind,]$pos/l
}
我认为data
应该是df
并从那里开始。我们位于i
和j
的两个循环中,它们都从1到20000.它们永远不会总和小于1/2
,因此您将始终执行第一个语句。此外,如果您曾预料到会发生FALSE
个案,那么您需要else
与结束括号相同的行:
if (i + j >= 1/2) {
df$X <- df$pos * 2
} else {
df$X <- df$pos
}
R是向量化的,因此执行上述操作与循环每个值并乘以2相同。我还删除了/ 1
语句,因为它没有做任何事情。整个部分可以移动到循环之外。由于添加列X
的列pos
的常量操作。{/ p>
接下来,你适合做的循环:
for (i in 1:100) { # 100 sample
sample(df$X,nrow(df), replace=FALSE)
fit=lm(X ~ gx, df) #linear regression calculation
regerror=sum(residuals(fit)^2)
print(paste(i,j,regerror))
set(dt,dti,1L,as.double(i))
set(dt,dti,2L,as.double(j))
set(dt,dti,3L,regerror)
dti=dti+1
}
拍摄,sample(df$X, nrow(df), replace=FALSE)
只会显示新订单。它没有实际分配它们。而是df$X <- sample(df$X, nrow(df), replace=FALSE)
。
现在,看起来你要在第dt
行分配到df
(这是一个与dti
非常相似的函数,应该避免作为变量名)这个合适的错误以及你的指标?据我所知,没有任何内容取决于i
或j
。相反,你将执行随机排序的60 * 60 * 100
次......如果这是你想做的事情,那么一定要去吧!但是要以有效的方式做到这一点:
df$X <- df$pos * 2
fit.fun <- function(n, dat) {
jumble <- sample(nrow(dat))
dat$X <- dat$X[jumble]
sum(residuals(lm(X ~ gx, dat))^2)
}
sapply(1:10, fit.fun, dat=df)