将功能应用于列表中的所有有意义的组合并以矩阵格式保存

时间:2019-07-03 10:15:18

标签: r function matrix lapply

我想将一个函数(距离矩阵之间的距离)应用于距离矩阵列表,并以矩阵/表格式提取计算出的值。

使用ecodist软件包进行计算,并嵌套lapply进行MRM距离计算的所有可能组合。

第1部分:

library("ecodist")

#example data
data(graze) 

#make list to get it looking like my data
grazelist<-as.list.data.frame(graze) 

#all vs all distance combination
grazedist<-lapply(names (grazelist),function(z) 
               lapply(names(grazelist),function(f)
              MRM(dist(grazelist [[z]])~ dist(grazelist[[f]]),nperm=1)))

这使得所有组合与所有可能的组合成为可能,但我只需要一种组合(矩阵的一半)的所有组合,因为计算需要很长时间,而下半部分的结果是相同的。任何想法如何解决这个问题?

第2部分:

我只想以矩阵格式在每次dist下收集$coef值,以进行后续处理。在这种情况下,1.000000e+00

R输出看起来像这样:

> head(grazedist[[1]])
[[1]]
[[1]]$`coef`
                     dist(grazelist[[z]]) pval
Int                          8.881784e-16    1
dist(grazelist[[f]])         1.000000e+00    1

[[1]]$r.squared
  R2 pval 
   1    1 

[[1]]$F.test
           F       F.pval 
3.753766e+18 1.000000e+00 

对于不从列表(称为txt)处理的简单R输出,我知道如何将其获取为csvMRM_calculation文件。

write.table(MRM_calculation$coef[2,1],file="file.txt")  

但是如何从列表中以数据帧,表或直接以矩阵格式收集dist的所有$coef值?

类似:

mapply(write.csv2, x=grazedist$coef, 
file=paste(names(grazedist),"value.csv"))

我在列表中使用较大的矩阵(1500x1500),但希望示例数据graze足以作为可重现的示例。

1 个答案:

答案 0 :(得分:1)

您可以使用combn来生成示例数据,而仅使用嵌套lapply生成351个组合,而不是729个组合(27 X 27)。然后,您可以使用FUN中的combn参数将函数应用于每个组合,并提取dist中的coef值并将其写入数据框。

library(ecodist)
df <- data.frame(value = combn(names(grazelist), 2, function(x)
         MRM(dist(grazelist[[x[1]]])~ dist(grazelist[[x[2]]]),nperm=1)$coef[[2]]))

然后将其写入csv

write.csv(df, "/path/to/file/filename.csv", row.names = FALSE)