我想将一个函数(距离矩阵之间的距离)应用于距离矩阵列表,并以矩阵/表格式提取计算出的值。
使用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)))
这使得所有组合与所有可能的组合成为可能,但我只需要一种组合(矩阵的一半)的所有组合,因为计算需要很长时间,而下半部分的结果是相同的。任何想法如何解决这个问题?
我只想以矩阵格式在每次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输出,我知道如何将其获取为csv
或MRM_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
足以作为可重现的示例。
答案 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)