【问题标题】:R - loop iteratively through lists and create a dataframeR - 通过列表迭代循环并创建一个数据框
【发布时间】:2018-07-02 14:18:45
【问题描述】:

我有一长串列表(> 100k),需要迭代循环遍历每个列表并提取“id” - 我可以通过在 for 循环中构造 lapply 轻松完成。

以下是列表示例:

l1 <- list(id="002e2b45555652749339ab9c34359fb6", key="2", value="xx")
l2 <- list(id="002e2b433226527493jsab9c34353fb6", key="4", value="zz")
l3 <- list(list1, list2)

我使用以下方法进行循环:

for(i in 1:20) {
  lapply(l3$id[[i]][1], function (x) print(x))
}

基本上打印 id 的每个列表的所有元素 - 这很好。 我最终想构建一个矩阵/数据框,其中包含行中的所有“id”。让我烦恼的是,我的循环中的打印效果很好,打印出所有列表中的所有 id - 尽管我无法将我的行绑定到数据框或矩阵等。我正在尝试类似的东西 - 没有做我想要的(虽然没有收到错误等)

for(i in 1:20) {
  lapply(l3$id[[i]][1], function (x) rbind(x))
}

所以所需的输出应该是(最好是作为数据帧)。

[1] "002e2b45555652749339ab9c3400cc52"
[1] "002e2b45555652749339ab9c34040525"

【问题讨论】:

    标签: r list loops for-loop iteration


    【解决方案1】:

    如果你想要一个 ID 向量,你可以这样做

    sapply(l3, "[[", "id")
    

    或使用 tidyverse 函数

    purrr::map_chr(l3, "id")
    

    在 R 中不需要循环这样的东西。

    【讨论】:

    • 太棒了!谢谢 - 虽然我的雷达上没有咕噜声
    【解决方案2】:

    使用基础 R:

    s=aggregate(.~ind,stack(setNames(l3,1:length(l3))),identity)
      ind                         values.1 values.2 values.3
    1   1 002e2b45555652749339ab9c34359fb6        2       xx
    2   2 002e2b433226527493jsab9c34353fb6        4       zz
    

    如果你只需要身份证

    s$values[,1]
    [1] "002e2b45555652749339ab9c34359fb6" "002e2b433226527493jsab9c34353fb6"
    

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多