我有许多 S4 对象,它们具有可变数量的插槽和插槽名称。每个时隙中的数据长度相同。例如 S4 对象peaks:
> str(peaks)
Formal class 'MassPeaks' [package "MALDIquant"] with 4 slots
..@ snr : num [1:16] 37.81 9.18 8.65 4.66 53.22 ...
..@ mass : num [1:16] 307 317 325 337 347 ...
..@ intensity: num [1:16] 2255 547 516 278 3173 ...
..@ metaData : list()
Run Code Online (Sandbox Code Playgroud)
我想将这些 S4 对象转换为数据帧。例如数据框df.peaks:
> str(df.peaks)
'data.frame': 16 obs. of 3 variables:
$ snr : num 37.81 9.18 8.65 4.66 53.22 ...
$ mass : num …Run Code Online (Sandbox Code Playgroud) 我想做的事
我有许多唯一的 ID,例如id1, id2, etc.。它们出现在多个组中,每个组都是 1 到 100 个 id 之间的随机样本,例如
[1] "id872- id103- id746-"
[2] "id830- id582-"
[3] "id663- id403- id675- id584- id866- id399- id28- id550-"
Run Code Online (Sandbox Code Playgroud)
我想找到一个id所属的所有组,例如id1
groups.with.id[1] = grep("id1-", groups)
Run Code Online (Sandbox Code Playgroud)
我的问题
数据量很大(80k id,1M 个组),在我的笔记本电脑上大约需要12 个小时。我认为这是我正在执行 80k 次(每个 id 一次)以及每次访问一个巨大对象(1M 组)的事实的组合。
有什么办法可以提高效率吗?
(我经常遇到 REg 中较大对象的问题,重复索引具有 >10k 行的数据帧会变得非常慢。也赞赏大型对象的有效索引的一般答案!)
示例代码
# make toy dataset
n.ids = 80000 # number of unique ids
n.groups = 100 # number of groupings
# make data
ids = …Run Code Online (Sandbox Code Playgroud) 我有很多非方阵,如下例所示:
1 1 0
1 1 0
1 1 0
1 0 1
Run Code Online (Sandbox Code Playgroud)
我想要一个通用的解决方案来找到这些矩阵中最大的密集连接区域。因此,对于我的示例,解决方案将返回rows=c(1, 2, 3), columns=c(1,2). 也就是说,我可以接受非最佳解决方案,即局部最小值就可以了。
我认为这类似于max-clique 问题。然而,我的矩阵不是方形的,它们不代表图形,所以我在使用像igraph::cliques(). 如何找到非方阵的密集连接区域?
为了澄清“密集区域”,我指的是矩阵中包含全 1 的任何矩形块,这可以通过重新排序行和列来实现。因此,原始矩阵中行和列的顺序并不重要,我想考虑顺序的所有排列。我真的在寻找与邻接矩阵中的派系类似/等效的区域,但是,同样,这些矩阵不是方形的。
我有一个由三部分组成的 R 分析(partA、partB和partC)。我将每个部分提交给 SLURM(例如sbatch partA),并且每个部分都通过 并行化#SBATCH --array=1-1500。这些零件是连续的,所以我需要等待一个零件完成才能开始下一个零件。现在我正在手动启动每项工作,但这不是一个很好的解决方案。
我想自动化这三个批处理调用。例如:
sbatch partApartA完成,sbatch partBpartB完成,sbatch partC我使用此解决方案获取 的作业 ID partA,并将其传递给strigger完成上面的步骤 2。然而我陷入了困境,因为我不知道如何获取partBfromstrigger的工作 ID 。我的代码如下所示:
#!/bin/bash
# step 1: sbatch partA
partA_ID=$(sbatch --parsable partA.sh)
# step 2: sbatch partB
strigger --set --jobid=$partA_ID --fini --program=/path/to/partB.batch
# step 3: sbatch partC
... ?
Run Code Online (Sandbox Code Playgroud)
我该如何完成第 3 步?
如何快速可视化R中的大型矩阵?
我有时使用大型数字矩阵(例如3000 x 3000),并且快速可视化它们是一个非常有用的质量控制步骤.这在我以前选择的语言Matlab中非常简单快捷.例如,显示1000x1000矩阵需要0.5秒:
rand_matrix = rand(1000,1000);
tic
imagesc(rand_matrix)
toc
>> Elapsed time is 0.463903 seconds.
Run Code Online (Sandbox Code Playgroud)
我想在R中具有相同的能力,但遗憾的是,在R中,可视化矩阵似乎非常缓慢.例如,使用image.plot()相同的随机矩阵需要10秒以上才能显示:
require(tictoc)
require(image.plot)
mm = 1000
nn = 1000
rand.matrix = matrix(runif(mm*nn), ncol=mm, nrow=nn)
tic("Visualizing matrix")
image.plot(rand.matrix)
toc()
> Visualizing matrix: 11.744 sec elapsed
Run Code Online (Sandbox Code Playgroud)
随着矩阵变大,问题变得更糟.例如,与Matlab中的秒数相比,3000x3000矩阵在R中可视化需要几分钟.这显然不适用于数据探索.我尝试过ggplot,而熔化+ geom_raster()仍然需要一分钟.
我究竟做错了什么?有没有一种快速的方法可视化R中的矩阵?一个理想的解决方案需要一两行.