如何使用数据框列表列表

时间:2018-10-28 02:16:50

标签: r list loops apply sna

我不确定这是否可行,甚至不确定如何解决以下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)
     ...

每个数据框都包含一个项目ID和相应的公司ID。

我现在的目标是将两方边缘列表转换为单模网络,然后进行与sna相关的其他计算(度,集中度,状态,社区检测等)并保存。

我知道如何使用一个(!)特定网络来执行这些步骤,但是这给了我一个非常困难的时机,无法在所述列表结构中一次针对所有网络自动执行此过程,并保存各种输出(节点级变量和网络级变量)。

我已经尝试查找for循环的几种方法并应用方法,但是仍然使我无法入睡,如何做,现在我感到非常无助。任何帮助或建议,将不胜感激。如果您需要更多信息或示例给我一个简短的演示或代码示例,该如何解决这种嵌套结构并以有效的自动方式对上述所有子集进行与sna相关的计算/修改,请随时与我联系

1 个答案:

答案 0 :(得分:1)

比方说,您有一个要应用到每个数据帧的函数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

这包括将函数应用于嵌套列表并将返回内容保存在类似的数据结构中。如果您需要有关计算效率,并行化等方面的帮助,建议使用一个可重现的示例再问一个专注于此的问题。