2016-12-03 15 views
1

ここからわかるように、同じIDを持つ2 + 2 + 1行があります。同じIDを持つ行を1つの行に変換したいと思います。複数行をIDで1行に変換するにはどうすればいいですか

  ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS 
297945203711 2009.08.31    MO   1   KS 60 
297945203711 2009.08.31    MO   2   KU 50 
297945303711 2009.08.31    SS   1   MA 60 
297945303711 2009.08.31    SS   1   KS 60 
297945403711 2009.08.31    JO   1   HB NA 

それは

(IDが同じであるときは、日付と「KASVUKOHA_KOOD」も同じであるので、私もそこに追加の日付と「KASVUKOHA_KOOD」を必要としない)、次のようになります
  ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS RINDE_KOOD PUULIIGI_KOOD VANUS 
297945203711 2009.08.31    MO   1   KS 60   2   KU 50 
297945303711 2009.08.31    SS   1   MA 60   1   KS 60 
297945403711 2009.08.31    JO   1   HB NA 

あなたがすでに理解しているように、私はこれを行う方法がわかりません。あなたが助けることができれば感謝します!

答えて

2

我々は、複数のvalue.var

library(data.table)#1.9.7+ 
res <- dcast(setDT(df1), ID+INVENT_KPV +KASVUKOHA_KOOD~rowid(KASVUKOHA_KOOD), 
          value.var = c("RINDE_KOOD", "PUULIIGI_KOOD", "VANUS")) 
#   ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD_1 RINDE_KOOD_2 PUULIIGI_KOOD_1 PUULIIGI_KOOD_2 VANUS_1 VANUS_2 
#1: 297945203711 2009.08.31    MO   1   2    KS    KU  60  50 
#2: 297945303711 2009.08.31    SS   1   1    MA    KS  60  60 
#3: 297945403711 2009.08.31    JO   1   NA    HB    NA  NA  NA 

res1 <- res[, c(1:3, order(as.numeric(sub("\\D+", "", names(res)[-(1:3)])))+3), with = FALSE] 
setnames(res1, sub("_\\d+$", "", names(res1)))[] 
#  ID INVENT_KPV KASVUKOHA_KOOD RINDE_KOOD PUULIIGI_KOOD VANUS RINDE_KOOD PUULIIGI_KOOD VANUS 
#1: 297945203711 2009.08.31    MO   1   KS 60   2   KU 50 
#2: 297945303711 2009.08.31    SS   1   MA 60   1   KS 60 
#3: 297945403711 2009.08.31    JO   1   HB NA   NA   NA NA 
+0

ありがとう取ることができdata.tableからdcastを使用することができます!しかし、これは今注文が乱れているので、私が必要とする結果ではありませんでした。 :/ –

+0

@ M.P。これと予想される出力との間に何の違いも見出されないので、列の順序について心配していますか?そして、簡単に変更することができます。 – akrun

+0

はい、私は本当にこのような命令が必要です:id、invent_kpv、kasvukoha_kood、rinde_kood、puuliigi_kood、vanus、そして再びrinde_kood、puuliigi_kood、vanusなどです。 番号1,2または3(たとえばrinde_kood_1)がないとうまくいくかもしれませんが、それは不可能だと思います。 単純に言えば、同じIDを持つ場合、隣り合った行をちょうど "コピー"できればすばらしいでしょう。 –

関連する問題