小编Iml*_*ith的帖子

R最大/最小可表示数字

我想在R中获得最大/最小的可表示数字.

输入".Machine"后

我有:

$double.xmin
[1] 2.225074e-308

$double.xmax
[1] 1.797693e+308
Run Code Online (Sandbox Code Playgroud)

但是,即使我在R命令提示符下键入2.225074e-309,我得到2.225074e-309而不是预期的0

如何找到最大/最小数字,其中加1或减1将导致Inf(添加1到最大数字)或0(从最小数字减去1)?

r data-representation

8
推荐指数
1
解决办法
4007
查看次数

在R中并行读取和处理文件

我正在使用parallelR中的库来处理我正在应用复杂操作的大型数据集.

为了提供可重现的代码,您可以在下面找到一个更简单的示例:

#data generation
dir <- "C:/Users/things_to_process/"

setwd(dir)
for(i in 1:800)
{
    my.matrix <- matrix(runif(100),ncol=10,nrow=10)

    saveRDS(my.matrix,file=paste0(dir,"/matrix",i))
}

#worker function
worker.function <- function(files)
{
    files.length <- length(files)
    partial.results <- vector('list',files.length)

    for(i in 1:files.length)
    {
        matrix <- readRDS(files[i])
        partial.results[[i]] <- sum(diag(matrix))
    }

    Reduce('+',partial.results) 
}


#master part
cl <- makeCluster(detectCores(), type = "PSOCK")

file_list <- list.files(path=dir,recursive=FALSE,full.names=TRUE)

part <- clusterSplit(cl,seq_along(file_list))
files.partitioned <- lapply(part,function(p) file_list[p])

results <- clusterApply(cl,files.partitioned,worker.function)

result <- Reduce('+',results)
Run Code Online (Sandbox Code Playgroud)

本质上,我想知道是否尝试并行读取文件将以交错方式完成.结果,如果这个瓶颈会降低并行运行任务的预期性能?

如果我首先在列表中一次读取所有矩阵然后将此列表的块发送到每个核心以便进行处理,那会更好吗?如果这些矩阵更大,我能够立即将它们全部加载到列表中吗?

parallel-processing file-io r large-files

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

在R中添加条件的向量元素

假设我有一个我要添加的元素向量:

a <- c(1,2,-7,5)
Run Code Online (Sandbox Code Playgroud)

以下是一些其他测试用例:

a <- c(1,2,-3,5)
a <- c(1,2,-7,-3,5)
Run Code Online (Sandbox Code Playgroud)

我知道我可以用它sum(a)来得到结果,但如果我有条件需要注意:

current_sum = 0
for(i in 1:length(a)){    
 last_sum = current_sum
 current_sum = current_sum + a[i]
 if(current_sum < 0)
 {
  current_sum = last_sum
  current_sum = current_sum + (a[i]*-1)
 }
}
Run Code Online (Sandbox Code Playgroud)

在这里,每次总和为负数时,我们返回前一个总和并添加使该总和为负数的相反数字.作为第一个例子的结果输出15

显然,元素向量在手之前是未知的,性能是有问题的.有没有完全矢量化的方法或更有效的方法来做到这一点(避免循环)?

performance r sum add conditional-statements

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

了解如何构建高阶马尔可夫链

假设我想预测,如果一个人的class1=healthyclass2= fever.我有一个包含以下域名的数据集:{normal,cold,dizzy}

转换矩阵将包含从我们的训练数据集生成的转换概率,而初始向量将包含一个人从域开始(第1天)具有状态x的概率{normal,cold,dizzy},同样这也是从我们的训练集生成的.

如果我想构建一阶马尔可夫链,我会为每个类生成一个3x3转换矩阵和一个1x3初始向量,如下所示:

> TransitionMatrix
       normal cold dizzy
normal     NA   NA    NA
cold       NA   NA    NA
dizzy      NA   NA    NA

>Initial Vector
     normal cold dizzy
[1,]     NA   NA    NA
Run Code Online (Sandbox Code Playgroud)

NA将填充相应的概率.

1 - 我的问题是关于高阶链中的过渡矩阵.例如,在二阶MC中,我们将有一个domain²xdomain²像这样的大小的转换矩阵:

               normal->normal normal->cold normal->dizzy cold->normal cold->cold cold->dizzy dizzy->normal dizzy->cold dizzy->dizzy
normal->normal             NA           NA            NA           NA         NA          NA            NA          NA           NA
normal->cold               NA           NA            NA           NA         NA          NA            NA          NA           NA
normal->dizzy              NA           NA            NA           NA         NA          NA            NA …
Run Code Online (Sandbox Code Playgroud)

algorithm markov-chains

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

为了更好的表现而努力

我想一个函数应用于矩阵的输入a,这个功能将改变第一个元素c[a[1]]和下一个元素,b[a[i],a[i+1]]从开始i = 1i = ncol(a) - 1.

示例输入:

a <- matrix(c(1,4,3,1),nrow=1)
b <- matrix(1:25,ncol=5,nrow=5)
c <- matrix(4:8,ncol=5,nrow=1)
Run Code Online (Sandbox Code Playgroud)

预期产量:

>a
4 16 14 3

#c[a[1]] gave us the first element: 4
#b[a[1],a[2]] gave us the second element: 16 
#b[a[2],a[3]] gave us the third element: 14
#b[a[3],a[4]] gave us the fourth element: 3
Run Code Online (Sandbox Code Playgroud)

mapply()到目前为止,我一直试图使用但没有任何成功.这个想法是避免循环,因为这些东西会导致R的主要性能下降

performance r matrix mapply

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