【问题标题】:Get the name of the list object then add that name as a new column of the each list获取列表对象的名称,然后将该名称添加为每个列表的新列
【发布时间】:2021-06-28 05:24:56
【问题描述】:

我有一个数据框列表。然后我想提取列表对象名称并将其添加为数据框中的第一列。然后我想取消列出并制作一个数据帧,逐行组合每个数据帧。它们都具有相同的尺寸。

下面我的数据框列表的一小部分

mylist <- list(SiO2 = structure(c(5.121, 0.00836394378003293, 0.0199499373432604, 
5, 10, 1.87883863763252, 0.0836503954062112, 2.1240292640167), .Dim = c(1L, 
8L), .Dimnames = list(NULL, c("Analyte_Mean", "SDBetweenGroup", 
"SDWithinGroup", "replicates", "NumSamples", "FValue", "PValue", 
"FCritical"))), Al2O3 = structure(c(2.0812, 0.0053103672189408, 
0.0159059737205869, 5, 10, 0.442687747035557, 0.903289230024797, 
2.1240292640167), .Dim = c(1L, 8L), .Dimnames = list(NULL, c("Analyte_Mean", 
"SDBetweenGroup", "SDWithinGroup", "replicates", "NumSamples", 
"FValue", "PValue", "FCritical"))))

我有以下获取列表对象名称的名称。但不确定如何将其作为每个数据帧的列传回

names(mylist)

制作我拥有的单个数据框

new_list <- as.data.frame(do.call(rbind, mylist)) 

感谢任何帮助。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    如果我的理解正确,我可能会使用purrr 库。 imap_dfr 会将您的矩阵及其名称传递给函数,然后将结果绑定到单个数据帧中。

    library(purrr)
    
    new_list <- imap_dfr(mylist, function(mat, name) {
      result <- as.data.frame(mat)
      result$name <- name
      result
    })
    

    给予

    > new_list
      Analyte_Mean SDBetweenGroup SDWithinGroup replicates NumSamples    FValue    PValue FCritical  name
    1       5.1210    0.008363944    0.01994994          5         10 1.8788386 0.0836504  2.124029  SiO2
    2       2.0812    0.005310367    0.01590597          5         10 0.4426877 0.9032892  2.124029 Al2O3
    

    【讨论】:

    • 感谢您的解决方案也很有效。如果我可以投票支持这两种解决方案,我会的。通过将名称作为第一列,Ronak Solution 产生了稍微好一点的最终结果。
    • 不用担心。尽管没有反对支持多个答案的规则。你只能接受一个答案——如果它最适合你,你肯定也应该为 Ronak 的答案做这件事——但赞成和接受是两件不同的事情。除非这是一个代表的事情?
    【解决方案2】:

    你可以使用purrr::map_df -

    purrr::map_df(mylist, data.frame, .id = 'name')
    
    #   name Analyte_Mean SDBetweenGroup SDWithinGroup replicates NumSamples
    #1  SiO2       5.1210    0.008363944    0.01994994          5         10
    #2 Al2O3       2.0812    0.005310367    0.01590597          5         10
    
    #     FValue    PValue FCritical
    #1 1.8788386 0.0836504  2.124029
    #2 0.4426877 0.9032892  2.124029
    

    或者在基础 R 中 -

    do.call(rbind, Map(cbind.data.frame, mylist, name = names(mylist)))
    

    【讨论】:

    • 您的 purr 解决方案效果最佳,因为它添加了带有名称的新列,而基本 R 解决方案创建了行名称而不是添加新列
    • @Spooked 看最后一列,最后有一列叫name。它还在此处创建行名。如果您希望name 成为第一列,请使用do.call(rbind, Map(cbind.data.frame, name = names(mylist), mylist))
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多