【问题标题】:Merging several lists to create a data frame in R合并多个列表以在 R 中创建数据框
【发布时间】:2020-09-17 06:59:33
【问题描述】:

如果已经在其他地方问过这个问题,请提前道歉,但我尝试了不同的尝试,但到目前为止没有任何效果。

我研究了来自 23 个测量空气污染的设备的数据。对于每个设备,我对 4 个参数(平均值、最大值、最小值和标准)感兴趣。我最终得到了 4 个列表,有 23 个值,代表每个设备的参数。

    var_names <- ls(envir = globalenv(), pattern = "^Device")
    Corrected_values<- mget(var_names)

    Device_mean <- lapply(Corrected_values, mean)
    Device_max <- lapply(Corrected_values, max)
    Device_min <- lapply(Corrected_values, min)
    Device_sd <- lapply(Corrected_values, sd)

现在我希望创建一个数据框“设备”,它将合并这 4 个列表。这个具有 4 列和 23 行的数据框(或矩阵)将可以导出以供进一步使用。到目前为止,我所有的尝试都导致了错误的矩阵。

    # rename the column names
    cols <- c("Mean", "Maximum", "Minimum", "Stdv")

感谢您的帮助

【问题讨论】:

  • data.frame(Device_mean, Device_max, Device_min, Device_sd)

标签: r list merge


【解决方案1】:

这是一个基本的 R 方式。

var_names <- ls(envir = globalenv(), pattern = "^Device")
Corrected_values <- mget(var_names)
f <- function(x){
  data.frame(Mean = mean(x), Maximum = max(x), Minimum = min(x), Stdv = sd(x))
}

do.call(rbind, Map(f, Corrected_values))
#         Mean Maximum Minimum      Stdv
#Device1 5.006     5.8     4.3 0.3524897
#Device2 6.588     7.9     4.9 0.6358796
#Device3 5.936     7.0     4.9 0.5161711

数据

Device1 <- iris[iris$Species == 'setosa', 'Sepal.Length']
Device2 <- iris[iris$Species == 'virginica', 'Sepal.Length']
Device3 <- iris[iris$Species == 'versicolor', 'Sepal.Length']

【讨论】:

    【解决方案2】:

    实际上,Rui Barradas 的建议是可行的,但似乎是因为

        f <- function(x){
          data.frame(Mean = mean(x), Maximum = max(x), Minimum = min(x), Stdv = sd(x))
        }
    

    使用预先在脚本中创建的 4 个列表自动识别“Mean = mean(x), Maximum = max(x), Minimum = min(x), Stdv = sd(x)”的含义。 不幸的是,如果我想添加一些其他创建的列表,它不起作用。事实上,现在想象我有 8 个列表,而不是之前显示的前 4 个列表:

    var_names <- ls(envir = globalenv(), pattern = "^Device")
    Corr_values<- mget(var_names)
    
    Device_mean <- lapply(Corr_values, mean) #list 1
    Device_max <- lapply(Corr_values, max) #list2
    Device_min <- lapply(Corr_values, min) #list3
    Device_sd <- lapply(Corr_values, sd) #list4
    
    hours_per_year <- 365*24
    multiply <- function(x, factor) {
    x * hours_per_year}
    Device_average_annual_dose <- lapply(Device_mean, multiply, factor = hours_per_year) #list5
    
    var_names_dates <- ls(envir = globalenv(), pattern = "^Date")
    Corr_dates<- mget(var_names_dates)
    Device_hours_with_values <- lapply(Corr_dates, length) #list6
    
    a <- (100/hours_per_year)
    multiply <- function(x, factor) {
    x * a}
    Device_availability <- lapply(Device_hours_with_values, multiply, factor = a) #list7
    
    subtract_me = 100
    Device_unavailability <- lapply(Device_availability, function(x, subt_amnt) subt_amnt - x,subt_amnt = subtract_me) #list8
    

    这 8 个列表已正确存储在 R 中。但在这种情况下,当我尝试您建议我使用 8 个列表名称合并 8 个列表时,我收到错误消息:

        Error in max(x) : invalid 'type' (list) of argument
    

    我不明白,因为这些正是我希望合并的一些列表...

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2016-12-23
      • 2021-10-04
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2016-06-25
      • 2019-07-19
      相关资源
      最近更新 更多