2016-12-03 41 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,就会非常棒。 –