2017-02-12 5 views
0

私は500Mbのファイルをワイドフォーマット(132カラム幅)で持っています.6つのカラムは時間1から16(96カラム)のインスタンスを記述する変数で、変化しない。データ構造を変更して、これらの各インスタンスのリスト列と、変化しない情報のための別の列を持つようにしたいと思います。時間インスタンスの変数名は、 "1"で終わる名前によって一意に与えられます。幅の広いデータフレームからリストカラムを持つデータフレームへ移動

gather(a, ... = dplyr::contains(ends_with("1"))) %>% nest(-id,-const81,-const6) 

をしかし、私は「1」で終わるすべての変数をループできないようにcontainsはベクトル化されていないと信じて:

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])) 

は、だから私は試してみました。さらに、Group_byをネストへの入力に使用できるのと同様に、「集められた列をネストした」機能を持つことは素晴らしいと思います。 data.tableするtidyverseから飛び降り

、I私は期待していた以上に面倒ですが、私は道を停止取得

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) 

することができます。今、定数変数に別のリスト列を追加したい場合、私はもうネストを使うことができません。 SO-

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

  1. どのように私はこれを簡単に行うことができますか?
  2. 私は、これらのリスト列はオブジェクトからメモリを節約すると考えています。なぜなら、データフレームに複製される情報が少なくて済むからです。

理想のデータ構造 - しかし、手順は不必要に複雑に思える:

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) 
関連する問題