【问题标题】:How to assign dataframes to specific locations in a list in R如何将数据框分配给 R 列表中的特定位置
【发布时间】:2020-08-04 21:43:12
【问题描述】:

我通过 for 循环创建了 15 个单独的数据框,每个数据框代表包含 15 个不同尺度/主题领域的每个调查项目的分数。根据我的主题区域的原始顺序,它们被命名为 df1 到 df15,但我想根据不同的排序顺序将它们放入一个列表中。我有一个单独的数据框,称为 topic.area,列出了 15 个主题区域中的每一个,它们的原始顺序,并以新的排序顺序排列:

Topic.Area...... orig.order... sort.order
领导力............3................1
订婚..... 1 .............2
创新............2......3
等等……

我基本上想要执行以下操作,但代码对我不起作用。我对 R 很陌生,所以我很欣赏任何不太先进的解决方案,所以我理解它们背后的逻辑。

myList<- list()

for(m in 1:15) {
 myList[[m]]<- paste("df", topic.area$orig.order[m], sep = "") 
}

我认为问题是您不能在赋值命令中使用粘贴功能,但我不知道如何解决这个问题。

【问题讨论】:

    标签: r list variable-assignment paste


    【解决方案1】:

    获取列表中的所有数据框。正如您所提到的,这已经由orig.order 订购。

    list_df <- mget(paste0('df', 1:15))
    

    您可以直接根据sort.order 排列它们:

    sorted_list_df <- list_df[topic.area$sort.order]
    

    【讨论】:

    • 嗯,这似乎不起作用。代码的第一部分放入了额外的数据帧,因为我有其他对象在名称中有“df”加上一个数字,所以列表的长度是 30。然后代码的第二部分留下了除了前两个列表之外的所有内容对象为空。
    • 我通过在“df”前面放一个 ^ 来使第一部分工作(我有其他带有 df# 的对象),但是排序不起作用。它从 1 到 10-15,然后是 2-9。
    • 首先检查list_df是否与orig.order中的顺序相同。
    • 如果您使用循环来创建数据框,您需要在 df 和数字之间添加前导零以创建正确的原始排序顺序。 df10 在字母数字排序中排在 df2 之前。您可以在for(i in 1:15) 循环中使用sprintf("df%02i",i) 来生成按数字顺序排序的名称。
    • OP 已发布They're named df1 through df15 based on the original order of my topic areas。所以我认为他们已经根据orig.order订购了。
    【解决方案2】:

    这是一个基于Pokémon Stats 数据的完全可重现的示例。我不只是将输入文件写入list(),而是使用assign() 在全局环境中模拟一组数据帧。

    download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/pokemonData.zip",
                  "pokemonData.zip",
                  method="curl",mode="wb")
    unzip("pokemonData.zip")
    
    thePokemonFiles <- list.files("./pokemonData",
                                  full.names=TRUE)
    filenames <- substr(list.files("./pokemonData",full.names = FALSE),1,5) 
    results <- lapply(1:length(thePokemonFiles),function(x) {
         # read data and assign to a name in global environment 
         data <- read.csv(thePokemonFiles[x],stringsAsFactor = FALSE)
         assign(filenames[x],data,globalenv())
         return(TRUE)
    })
    

    此时我们在全局环境中有 7 个数据框,分别命名为 gen01gen07

    接下来,我们生成所需的排序顺序作为向量。我们将使用它以及来自filenames 向量的名称来获取数据并以所需的数据帧排序顺序构建输出列表。

    desiredSortOrder <- c(1,3,5,7,2,4,6)
    sortedDataFrames <- lapply(desiredSortOrder,function(x){
         get(filenames[x])
    })
    # verify generation numbers by printing first row of each data frame 
    lapply(sortedDataFrames,function(x){
         x[1,c(1,2,12)]
    })
    

    由于每个数据帧中的Generation 列与其关联的文件名匹配,我们可以通过打印每个数据帧的第一行来验证排序顺序。

    >lapply(sortedDataFrames,function(x){
    +      x[1,c(1,2,12)]
    + })
    [[1]]
      Number      Name Generation
    1      1 Bulbasaur          1
    
    [[2]]
      Number    Name Generation
    1    252 Treecko          3
    
    [[3]]
      Number    Name Generation
    1    494 Victini          5
    
    [[4]]
      Number   Name Generation
    1    722 Rowlet          7
    
    [[5]]
      Number      Name Generation
    1    152 Chikorita          2
    
    [[6]]
      Number    Name Generation
    1    387 Turtwig          4
    
    [[7]]
      Number    Name Generation
    1    650 Chespin          6
    
    > 
    

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2016-03-24
      • 2023-03-17
      • 2016-05-20
      • 1970-01-01
      • 2021-06-22
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多