2017-02-12 22 views
0

У меня есть файл 500 Мб в широком формате (132 столбца в ширину), где шесть столбцов являются переменными, описывающими экземпляр в момент времени от 1 до 16 (96 столбцов), а 36 из них не изменяющийся. Я хотел бы изменить структуру данных, чтобы у меня есть listcolumn для каждого из этих экземпляров и отдельный столбец для неизменяющейся информации. Имена переменных для экземпляров времени уникально задаются именами, заканчивающимися на «1».Перейдите от широкого блока данных к кадру данных с listcolumns

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) 

, который является более трудоемким, чем я надеялся, но заставляет меня остановить путь. Теперь, если я хочу добавить еще один listcolumn для постоянных переменных, я больше не могу использовать гнездо.

a_long%>% nest(-id,-instance) 
Error in grouped_indices_impl(groups$data, groups$groups) : 
    cannot group column instance, of class 'list' 

Так что-

  1. Как я могу сделать это легко?
  2. Я бы поверила, что эти listcolumns сохранили бы память из Object в том, что меньше информации дублируется в dataframe - но делает?

Желаемая структура данных - но шаги кажутся излишне сложными:

a_long %>% select(1:3) %>% nest(-id,.key = const) %>% left_join(a_long) %>% select(-const82,-const6) 
+0

вы можете поделиться ожидаемым выходом на основе ваших входных данных? – mtoto

ответ

0

Это похоже на работу

gather(a,variable,values,ends_with("1")) %>% nest(-id,-const82,-const6) 
# # A tibble: 3 × 4 
#  id const82  const6    data 
# <chr> <chr>  <date>   <list> 
# 1  A 1952 2017-04-08 <tibble [4 × 6]> 
# 2  B 1960 2017-04-07 <tibble [4 × 6]> 
# 3  C 1970 2017-04-06 <tibble [4 × 6]> 

и когда вам нужно использовать символы в качестве имен в функции dplyr, как правило, есть представляет собой версию _, например gather_

a %>% gather_("variable", "values",str_subset(colnames(.),"1+$")) %>% 
    nest(-id,-const82,-const6)