我有一个这样的数据框列表:
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
)作为列名。我甚至不确定要尝试什么。感谢。
答案 0 :(得分:3)
使用dplyr::bind_rows
和tidyr::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]]]
等语法都可以使用。