Как использовать список списков данных - PullRequest
0 голосов
/ 28 октября 2018

Я не уверен, возможно ли это или даже как получить хорошее разрешение для следующей проблемы R.

Данные / Предпосылки / Структура: я собрал большой набор данных о сотрудничестве по проектам, который отображает конкретные проекты для компаний-участников (это можно понимать как двусторонний крайний список для анализа социальных сетей).Из-за аналитических соображений рекомендуется помещать весь набор данных в разные подмножества разных местоположений и периодов времени.Поэтому я создал следующую структуру данных

sna.location.list 
[[1]]           (location1)
     [[1]]      (is a dataframe containing the bip. edge-list for time-period1)
     [[2]]      (is a dataframe containing the bip. edge-list for time-period2)
     ...
     [[20]]     (is a dataframe containing the bip. edge-list for time-period20)
[[2]]           (location2)
     ...         (same as 1)
 ...
[[32]]          (location32)
     ...

Каждый фрейм данных содержит идентификатор проекта и соответствующие идентификаторы компании.

Моя цель теперь состоит в том, чтобы преобразовать двудольные краевые списки в однорежимные сети, а затем выполнить некоторые дополнительные вычисления, связанные с sna (степень, централизация, статус, обнаружение сообщества и т. Д.), И сохранить их.

Я знаю, как выполнять эти этапы расчета с одной (!) Конкретной сетью, но мне очень трудно автоматизировать этот процесс для всех сетей одновременно в описанной структуре списка и сохранитьразличные выходные данные (переменные уровня узла и уровня сети) в аналогичной структуре.

Я уже пытался найти несколько способов создания циклов и применять подходы, но это все еще дает мне бессонные ночи, как это сделать, и сейчас я чувствую себя очень беспомощным.Любая помощь или предложения будут высоко оценены.Если вам нужна дополнительная информация или примеры, чтобы дать мне краткий демонстрационный пример или пример кода, как справиться с такой вложенной структурой и выполнить такие вычисления / модификации, связанные с sna, для всех вышеупомянутых подмножеств эффективным автоматическим способом, пожалуйста, не стесняйтесь связаться со мной.

1 Ответ

0 голосов
/ 28 октября 2018

Допустим, у вас есть функция foo, которую вы хотите применить к каждому фрейму данных.Эти фреймы данных находятся в списках, поэтому lapply(that_list, foo) - это то, что нам нужно.Но у вас есть куча списков, поэтому мы на самом деле хотим lapply , что сначала lapply во внешнем списке, следовательно, lapply(that_list, lapply, foo).(foo будет передано внутреннему lapply с .... Если вы хотите быть более явным, вы можете использовать вместо этого анонимную функцию: lapply(that_list, function(x) lapply(x, foo)).

Вы не даливоспроизводимый пример, поэтому я продемонстрирую применение функции nrow к списку встроенных фреймов данных

d = list(
  list(mtcars, iris),
  list(airquality, faithful)
)

result = lapply(d, lapply, nrow)
result
# [[1]]
# [[1]][[1]]
# [1] 32
# 
# [[1]][[2]]
# [1] 150
# 
# 
# [[2]]
# [[2]][[1]]
# [1] 153
# 
# [[2]][[2]]
# [1] 272

Как видите, на выходе получается list с той же структурой.Если вам нужны имена, вы можете переключиться на sapply с помощью simplify = FALSE.

Это касается применения функций к вложенному списку и сохранения результатов в аналогичной структуре данных. Если вам нужна помощь с эффективностью вычислений,распараллеливание и т. д., я бы предложил задать отдельный вопрос, посвященный этому, с воспроизводимым примером.

...