2016-12-03 56 views
1

正如您在這裏看到的,我有2 + 2 + 1行具有相同的ID。我想將具有相同ID的行轉換爲單行。我如何通過R中的ID將多行行轉換爲單行ID

  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 

它應該是這樣的(我也不需要額外的時間和「KASVUKOHA_KOOD」那裏,因爲當ID是一樣的,那麼日期和「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

我們可以使用dcastdata.table可以採取多種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

謝謝!但這不是我需要的結果,因爲現在訂單已經搞亂了。 :/ –

+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,就會非常棒。 –