我有一个宽格式(132 列宽)的 500Mb 文件,其中六列是描述时间 1 到 16(96 列)的实例的变量,其中 36 列是不变的。我想更改数据结构,以便为每个实例提供一个列表列,并为不变信息提供一个单独的列。时间实例的变量名称由以“1”结尾的名称唯一给出。
library(tidyverse)
a<-data_frame(id=c("A","B","C"),
const82=c("1952","1960","1970"),
const6=as.Date(today()-c(1:3)),
var1=c(1:3),
z21=c(letters[1:3]),
o31=c(11:13),
m41=c(LETTERS[11:13]),
var2=c(4:6),
z22=c(letters[4:6]),
o32=c(20:22),
m42=c(LETTERS[7:9]))
所以我尝试了:
gather(a, ... = dplyr::contains(ends_with("1"))) %>% nest(-id,-const81,-const6)
但我相信contains
没有矢量化,因此我无法遍历所有以“1”结尾的变量。此外,就像 Group_by 可用于嵌套的输入一样,我相信拥有一个“嵌套收集的列”的函数会很棒。
从 tidyverse 跳到 data.table,我可以
a_long<-melt(setDT(a), id=c("id","const82","const6"),
measure=patterns(c("^var\\d","^z2\\d","^o3\\d","^m4\\d")),
value.name=vary<-c("var","z2","o3","m4"),
variable.name="num")%>%
nest(... = num:m4,.key=instance)
这比我希望的要费力,但让我停下来。现在,如果我想为常量变量添加另一个列表列,我不能再使用嵌套了。
a_long%>% nest(-id,-instance)
Error in grouped_indices_impl(groups$data, groups$groups) :
cannot group column instance, of class 'list'
所以-
- 我怎样才能轻松做到这一点?
- 我相信这些列表列会从对象中节省内存,因为在数据帧中重复的信息更少 - 但真的吗?
所需的数据结构 - 但步骤似乎不必要地复杂:
a_long %>% select(1:3) %>% nest(-id,.key = const) %>% left_join(a_long) %>% select(-const82,-const6)