【问题标题】:How to use List of List of Dataframes如何使用数据框列表列表
【发布时间】:2018-10-28 02:16:50
【问题描述】:

我不确定这是否可能,甚至不确定如何为以下 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 相关的计算/修改,请随时与我联系.

【问题讨论】:

    标签: r list loops apply sna


    【解决方案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。如果需要名称,可以使用simplify = FALSE 切换到sapply

    这包括将函数应用于嵌套列表并将返回值保存在类似的数据结构中。如果您在计算效率、并行化等方面需要帮助,我建议您提出一个针对此的单独问题,并提供一个可重复的示例。

    【讨论】:

    • 非常感谢你真的帮助我理解!另一方面,因为我是新手,所以申请家庭有时会让我感到困惑。因此,我首先尝试将逻辑放入普通的 for 循环中,然后尝试一些应用函数。因此,我想问一下,这整个事情是否也可以通过嵌套循环来实现,例如: for i seq_along(sna.location.list[[i]]) .... for j seq_along(sna.location.list[ [i]][[j]]).... 这对我来说似乎更直观,例如,如果我想访问和更改新创建的 igraph 对象的属性。
    • 是的,确实可以。如果您在for 循环方法方面需要帮助,我建议(a)想出一个您自己的完全可重现的玩具示例,(b)尝试使用 for 循环自己解决它,以及(c)如果如果您遇到问题,请发布一个新问题,展示您的可重现示例以及您的最佳尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多