【问题标题】:How can I transform a list in multiple dataframes in R?如何在 R 中转换多个数据框中的列表?
【发布时间】:2020-06-19 11:30:31
【问题描述】:

我有一个包含多个矩阵的列表。我可以使用以下代码将此列表中的一项转换为数据框:

as.data.frame(list_of_matrices[i])

但我怎样才能以自动方式对所有索引 (i) 执行相同操作?

我试过了:

a <- data.frame()
for(i in 1:length(list_of_matrices)){
  dataframes[i] <- as.data.frame(list_of_matrices[i])
}

但它没有用:

Error in `[[<-.data.frame`(`*tmp*`, i, value = list(X1 = 1:102, X2 = c(2L,  : 
  replacement has 102 rows, data has 0

【问题讨论】:

    标签: r list dataframe matrix


    【解决方案1】:

    在 OP 的代码中,我们需要 [[ 而不是 [,因为通过执行 [,它仍然是长度为 1 的 list

    for(i in seq_along(list_of_matrices)){
        list_of_matrices[[i]] <- as.data.frame(list_of_matrices[[i]])
      }
    

    如果我们需要全局环境中的多个对象(不推荐),assignlist2env 应该可以工作。用自定义名称或letters(a、b、c、..)命名list 后,使用list2env

    names(list_of_matrices) <- letters[seq_along(list_of_matrices)]
    list2env(list_of_matrices, .GlobalEnv)
    

    现在,我们检查

    head(a)
    head(b)
    

    另一个选项是`在循环本身中赋值

    for(i in seq_along(list_of_matrices)) {
        assign(letters[i], as.data.frame(list_of_matrices[[i]])
     }
    
    head(a)
    head(b)
    

    注意:我们假设 list_of_matrices 的长度小于 26,否则必须将名称从内置的 letters 更改为其他名称..

    【讨论】:

    • 但它变成了一个数据框列表。我想输出多个数据帧(不在列表中)。我不知道这是否可能。谢谢!
    • @AntonioCosta 我建议不要这样做,因为它会在全局环境中创建很多对象。这些数据集的名称是什么
    • 我尝试使用您的解决方案,但在使用您的第一个脚本后,我收到以下错误消息:“'closure' 类型的对象不是子集”。有什么解决办法吗?
    【解决方案2】:

    试试这个:

    # Example list of matrices
    mat_list <- list(
      matrix(runif(20), 4, 5),
      matrix(runif(20), 4, 5)
    )
    # Convert to list of df
    df_list <- lapply(mat_list, as.data.frame)
    

    【讨论】:

    • 但 df_list 仍然是数据帧列表
    • 也许我问错了。期望的输出是什么?据我所知,您想将矩阵列表转换为数据框列表的问题和代码。
    • 如果我输入“ as.data.frame(list_of_matrices[i]) ”,我可以将该列表的索引转换为数据框。但我想对所有索引都这样做。无需输入 as.data.frame(list_of_matrices[1]), as.data.frame(list_of_matrices[2])...谢谢!!!
    • s what lapply` 正在做。它将列表中的每个矩阵转换为数据框。它在某种意义上只是 for 循环的简写。结果是一样的。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多