2017-02-12 62 views
0

我有一個寬文件(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' 

所以 -

  1. 我怎樣才能做到這一點很容易?
  2. 我相信這些listcolumns會節省對象的內存,因爲少數信息在數據框中被複制 - 但是這樣做嗎?

期望中的數據結構 - 但步驟似乎不必要地複雜化:

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)