【问题标题】:Specifying order in list of multiple dataframes [duplicate]在多个数据框列表中指定顺序[重复]
【发布时间】:2021-02-08 20:42:32
【问题描述】:

我正在尝试运行模拟,但在按 i 排序的列表中存储多个名为“data_i”的数据帧时遇到问题。我从一个名为“data_”的 df 开始,其中包含从 1901 到 2032(132 行)的数据。我应用一个循环来为每行创建一个名为 data_1、data_2、data_3、...、data_132 的数据帧(第 2032 行存储在 data_132 中)。最后,我将所有这些数据帧存储在一个列表中,并使用 lapply 在每个数据帧中创建一个列。这是一个可重现的示例:

#Main dataframe
time <- 1901:2032
b <- 1:132
data_ <- data.frame(time,b)


#Loop for creating data_i where i goes from 1 to 132
simulations <- 10000
for (i in 1:132) {
  assign(paste("data_",i, sep = ""), as.data.frame( sapply(data_[i,], function(n) rep(n,simulations)), stringsAsFactors = FALSE )) 
}

#Store all dataframes in list (**I THINK THE PROBLEM IS HERE**)
data_names<-str_extract(ls(), '^data_[[:digit:]]{1,3}$')[!is.na(str_extract(ls(), '^data_[[:digit:]]{1,3}$'))]
dataframes<-lapply(data_names, function(x)get(x))

#Create a new column in each dataframe
new_list <- lapply(dataframes, function(x) cbind(x, production = as.numeric(runif(simulations, min = 50, max = 100))))

#Create data_newi in environnment                                                
list2env(setNames(new_list,paste0("data_new", seq_along(dataframes))), 
         envir = parent.frame())

代码运行,但问题是数据帧的顺序不是 data_1, data_2,data_3,...,data_132 而是 data_1,data_10,data_100,data_101...这会生成 data_names 按该顺序存储这些值.例如,这将导致 2032 不像我希望的那样在 data_new132 中。

有人知道如何解决这个问题吗?提前致谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    (这是一个骗子,并且已适当关闭。我鼓励您查看骗子问题以供参考。这是针对您的起点的特定定制。)

    ls() 默认为sorted=TRUE,这意味着您的姓名按字母顺序排序。这种排序与数字排序不同。

    如果你想要一个框架列表开始,然后制作一个框架列表,不要经历assign/get的舞蹈。一旦你把它放在一个列表中,把它保留在那里,然后使用lapply 及其相关函数在所有帧上执行你的任务。

    time <- 1901:2032
    b <- 1:132
    data_ <- data.frame(time,b)
    
    simulations <- 10
    ints <- seq_len(132)
    set.seed(2021)
    new_list <- lapply(setNames(ints, paste0("data_", ints)), function(i) {
      cbind(
        data_[rep(i, simulations),],
        production = runif(simulations, min = 50, max = 100)
      )
    })
    length(new_list)
    # [1] 132
    new_list[1:2]
    # $data_1
    #     time b production
    # 1   1901 1   72.56337
    # 1.1 1901 1   89.18899
    # 1.2 1901 1   85.48411
    # 1.3 1901 1   69.08721
    # 1.4 1901 1   81.81619
    # 1.5 1901 1   85.06730
    # 1.6 1901 1   82.02195
    # 1.7 1901 1   63.33399
    # 1.8 1901 1   90.77108
    # 1.9 1901 1   99.14934
    # $data_2
    #     time b production
    # 2   1902 2   51.36335
    # 2.1 1902 2   91.87452
    # 2.2 1902 2   80.16204
    # 2.3 1902 2   78.37267
    # 2.4 1902 2   91.00264
    # 2.5 1902 2   62.57856
    # 2.6 1902 2   75.27470
    # 2.7 1902 2   93.37691
    # 2.8 1902 2   97.90908
    # 2.9 1902 2   77.28489
    

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2019-04-01
      • 2019-12-03
      • 2018-12-05
      • 2013-04-09
      相关资源
      最近更新 更多