【问题标题】:List of data frames to nested list based on names - R基于名称的嵌套列表的数据框列表 - R
【发布时间】:2018-04-11 22:13:31
【问题描述】:

我有一个这样的数据框列表:

dflist <- list(
  X2013.11.14.Date = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), X2013.11.14.Treatment = data.frame(replicate(2,sample(0:1,5,rep=TRUE))),
  X2013.11.14.Value = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), X2014.08.12.Date = data.frame(replicate(2,sample(0:1,5,rep=TRUE))),
  X2014.08.12.Treatment = data.frame(replicate(2,sample(0:1,5,rep=TRUE))), X2014.08.12.Value = data.frame(replicate(2,sample(0:1,5,rep=TRUE))))

在列表中,每个数据框都用一个日期和这样的描述来命名:

names(dflist)
#[1] "X2013.11.14.Location"      "X2013.11.14.Treatment" "X2013.11.14.Value"    "X2014.08.12.Location"     
#[5] "X2014.08.12.Treatment" "X2014.08.12.Value" 

我想使用它们名称的日期部分(例如X2013.11.14)将各个数据框组合成新的更大的数据框,将它们保留在列表中,如果可能的话,将日期作为列表元素名称和描述(例如Location)作为列名。我什至不确定要尝试什么。谢谢。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    使用dplyr::bind_rowstidyr::separate 的选项将数据排列在具有日期/时间的数据框中。

    此解决方案与@Frank 提供的解决方案类似。

    library(tidyverse)
    library(lubridate)
    
    bind_rows(dflist, .id = "ID") %>%
      separate(ID, c("Year", "Month", "Day", "Type"), sep = "\\.") %>%
      mutate(Year = gsub("X","",Year)) %>%
      unite( "Date", Year, Month, Day, sep = "-") %>%
      mutate(Date = ymd(Date)) 
    
    #          Date      Type X1 X2
    # 1  2013-11-14      Date  0  0
    # 2  2013-11-14      Date  0  0
    # 3  2013-11-14      Date  0  1
    # 4  2013-11-14      Date  0  1
    # 5  2013-11-14      Date  1  0
    # 6  2013-11-14 Treatment  0  0
    # 7  2013-11-14 Treatment  1  0
    # 8  2013-11-14 Treatment  0  0
    # 9  2013-11-14 Treatment  0  0
    # 10 2013-11-14 Treatment  1  0
    # ...so on
    

    【讨论】:

    • 谢谢@Frank。是的。我应该修改Date 列来表示日期格式。我马上更新。
    【解决方案2】:

    我愿意……

    patt = "^X(.{10}).(.*)$"
    
    library(data.table)
    DT = rbindlist(dflist, id="name")
    
    DT[, `:=`(
      date = as.IDate(sub(patt, "\\1", name), format = "%Y.%m.%d"),
      var = sub(patt, "\\2", name),
      name = NULL
    )]
    

    这给了...

        X1 X2       date       var
     1:  0  0 2013-11-14      Date
     2:  0  1 2013-11-14      Date
     3:  1  1 2013-11-14      Date
     4:  1  0 2013-11-14      Date
     5:  1  1 2013-11-14      Date
     6:  1  0 2013-11-14 Treatment
     7:  0  0 2013-11-14 Treatment
     8:  1  1 2013-11-14 Treatment
     9:  0  1 2013-11-14 Treatment
    10:  1  0 2013-11-14 Treatment
    11:  1  0 2013-11-14    Values
    12:  1  1 2013-11-14    Values
    13:  0  0 2013-11-14    Values
    14:  1  0 2013-11-14    Values
    15:  1  1 2013-11-14    Values
    16:  0  1 2014-08-12      Date
    17:  1  1 2014-08-12      Date
    18:  1  0 2014-08-12      Date
    19:  1  1 2014-08-12      Date
    20:  1  1 2014-08-12      Date
    21:  0  0 2014-08-12 Treatment
    22:  0  0 2014-08-12 Treatment
    23:  0  0 2014-08-12 Treatment
    24:  0  1 2014-08-12 Treatment
    25:  1  1 2014-08-12 Treatment
    26:  1  0 2014-08-12     Value
    27:  1  0 2014-08-12     Value
    28:  0  0 2014-08-12     Value
    29:  0  0 2014-08-12     Value
    30:  1  0 2014-08-12     Value
        X1 X2       date       var
    

    顺便说一句,我们在这里看到名称不一致(值与值)。


    为什么要一张表而不是一张以日期为名称的列表?当日期存储为名称时,它们就不是日期——它们只是字符串——并且您不能使用像month()difftime() 这样的标准函数来处理它们。如果你真的想要一份清单,还有……

    listDT = DT[, list(tab = list(.SD)), by=date]
    
             date          tab
    1: 2013-11-14 <data.table>
    2: 2014-08-12 <data.table>
    

    这样,日期仍然可以正确存储,并且您有一个表格列表(在第二列中)。要访问每个表,可以使用 listDT[date == "2013-11-14", tab[[1]]] 之类的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多