基于名称的嵌套列表的数据帧列表 - R.

时间:2018-04-11 22:13:32

标签: r list dataframe

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

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)作为列名。我甚至不确定要尝试什么。感谢。

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分: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]]]等语法都可以使用。