применить функцию ко всем значимым комбинациям в списке и сохранить в матричном формате - PullRequest
1 голос
/ 03 июля 2019

Я хочу применить функцию (расстояние между матрицами расстояний) к списку матриц расстояний и извлечь вычисленное значение в формате матрицы / таблицы.

Использование пакета 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 или csv для простого вывода R, не обработанного из списка (и называемого 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 достаточны в качестве воспроизводимого примера.

1 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать combn, который генерирует для ваших примеров данных только 351 комбинацию, а не 729 комбинаций (27 X 27) с использованием вложенных lapply.Затем можно применить функцию к каждой комбинации, используя аргумент 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)
...