2017-12-28 11 views
0

私はこのようなプログラムの出力を持っています。 R:異なるヘッダーやデータフレームのオーバーフローする部分を持つデータフレームの部分を添付する方法Cont

Keg  tar tar jar jar EA_A EA_D EA_E EA_G 
123F 0  1 0  0 0  0  0  0 
134E 0  0 0  0 0  1  1  1 
234B 0  0 0  0 0  0  0  0 
Keg  EA_B 
123F 0 
134E 0 
234B 1 
Keg  tar tar jar jar EA_C EA_D EA_E 
ABCD 0  1 0 0 0  0  0 
13CD 0  0 0 0 0  1  1 
234F 0  0 0 0 1  0  0 
DCEF 0  0 0 0 0  0  0 
Keg  EA_F 
ABCD 0 
13CD 0 
234F 1 
DCEF 0 
Keg  tar tar jar jar EA_A EA_D EA_E EA_H 
123C 0  1 0 0  0 0  0  0 
134C 0  0 0 0  0 1  1  1 
234C 0  0 0 0  0 0  0  0 
Keg  EA_B 
123C 0 
134C 0 
234C 1 

は、私はここに( R:How to attach parts of a data frame with different headers and/or an overflowing piece of the dat frame) いつか前に非常によく似た質問をしていたとの回答を得ていた

Keg  EA_A EA_B EA_C EA_D EA_E EA_F EA_G EA_H 
123F 0  0  0  0  0  0  0  0 
134E 0  0  0  1  1  0  1  0 
234B 0  1  0  0  0  0  0  0 
ABCD 0  0  0  0  0  0  0  0 
13CD 0  0  0  1  1  0  0  0 
234F 0  0  1  0  0  1  0  0 
DCEF 0  0  0  0  0  0  0  0 
123C 0  0  0  0  0  0  0  0 
134C 0  0  0  1  1  0  0  1 
234C 0  1  0  0  0  0  0  0 

する出力を手配しようとしています。新しい出力を古いソリューションに合わせようとすると、誤った出力が得られます。

私はこの記事を自己完結型にするために、ここの前の記事のほとんどを含めています。私の意見では、以前の解決策は機能していたはずですが、私は何が欠けているのか分かりません。

旧ポスト:

は、1つのチャンクとして、二つの連続keg`s間のテキストを想定します。

この例では、最初の2つのチャンクは同じKeg値を持ちます。実際には、テキストがオーバーフローし、結果として同じKeg値を持つ2番目のチャンクが生成されます。すべての新しいチャンク(オーバーフローするチャンクではない)には列タールがあります。

出力によって示されるように、タールとジャーの列を端に向かって剥がす必要があります。列の数は有限であり、( "EA_A"、 "EA_B"、 "EA_C"、 "EA_D"、 "EA_E"、 "EA_F"、 "EA_G"、 "EA_H")とみなすことができる。

出力には任意の数のチャンクを入れることができます。どんな溢れるチャンクもその家族の下にあります。データのチャンクには常に名前の有限集合の一部である列名があります。列名は繰り返されません。

データのチャンクは、カラム名の順番が異なる場合があります。

これは私が使用していたコード(または、私が前のポストから得た)

nm1 <- c("EA_A", "EA_B", "EA_C", "EA_D", "EA_E", "EA_F", "EA_G","EA_H") 
temp = split(df1, cumsum(grepl("[A-Z]", df1$tar))) %>% 
    map(~ if(any(grepl("[A-Z]", .$tar))) { 
    names(.) <- unlist(.[1,]) 
    .[-1,] 
    } else .) %>% 
    map(~ .[names(.) != ""]) %>% 
    bind_rows %>% 
    group_by(Keg) %>% 
    summarise_at(vars(intersect(nm1, names(.))), funs(sum(as.numeric(.), 
    na.rm = TRUE)))                      
+0

コードを変更して動作させる必要があるかどうかを確認しようとしています。私の理解がここでの問題であることを確かめてください。 @akrun – Acinonyx

+0

アイデア? @akrun – Acinonyx

答えて

0

Okieです。これを理解する。私がしなければならなかったのは、大文字小文字を無視するようにgrepを変更することでした。

nm1 <- c("EA_A", "EA_B", "EA_C", "EA_D", "EA_E", "EA_F", "EA_G","EA_H") 
temp = split(df1, cumsum(grepl("[A-Z]", df1$tar, ignore.case = TRUE))) %>% 
    map(~ if(any(grepl("[A-Z]", .$tar, ignore.case = TRUE))) { 
    names(.) <- unlist(.[1,]) 
    .[-1,] 
    } else .) %>% 
    map(~ .[names(.) != ""]) %>% 
    bind_rows %>% 
    group_by(Keg) %>% 
    summarise_at(vars(intersect(nm1, names(.))), funs(sum(as.numeric(.), 
    na.rm = TRUE)))                      
関連する問題