Re: [問題] 階層資料列轉欄

作者: cywhale (cywhale)   2016-12-22 12:38:09
library(data.table)
library(magrittr)
dt <- fread('LV Obj Dep
0 A1 ""
1 A1 A1
2 B1 A1
1 A1 A1
2 B2 A1
3 C1 B2
1 A1 A1
2 B2 A1
3 C2 B2
4 D1 C2')
dt[,stx:=ifelse(LV<1,"Dep1",paste0("Dep",LV)),by=.(LV)] %>%
.[,nL:=as.integer(stx=="Dep1")] %>%
.[,ngp:=cumsum(nL)]
x1 <- dcast(dt, ngp ~ stx, value.var = "Obj")
# ngp Dep1 Dep2 Dep3 Dep4
#1: 1 A1 NA NA NA
#2: 2 A1 B1 NA NA
#3: 3 A1 B2 C1 NA
#4: 4 A1 B2 C2 D1
※ 引述《criky (立業成家)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 新手(沒寫過程式,R 是我的第一次)
: [問題敘述]:
: 資料如下:
: id LV Obj Dep
: 1 0 A1
: 2 1 A1 A1
: 2 2 B1 A1
: 3 1 A1 A1
: 3 2 B2 A1
: 3 3 C1 B2
: 4 1 A1 A1
: 4 2 B2 A1
: 4 3 C2 B2
: 4 4 D1 C2
: 想將資料轉成以下方式:
: id Obj Dep1 Dep2 Dep3 Dep4
: 1 A1 A1
: 2 A1 A1 B1
: 3 A1 A1 B2 C1
: 4 A1 A1 B2 C2 D1
: 空格可以填NA或留空都可,
: 階層數不一定,最小0,最大30
: 同一個Obj可能有許多階層的關係~
: 再請教大家了,謝謝
: [關鍵字]:
: level
: 自己查版上文章看推文,將主要部分試出來了,
: dt_list<-tapply(dt$Obj,dt$id,c)
: $`1`
: [1] "A1"
: $`2`
: [1] "A1" "B1"
: $`3`
: [1] "A1" "B2" "C1"
: $`4`
: [1] "A1" "B2" "C2" "D1"
: 本來想用 do.call(rbind,.) 但有空格處會以重覆值填補
: 若用as.data.frame將list轉df,
: 則是只有1個變數,還要再分割處理
: 後來發現tapply只看obj及id,
: 但真實data可能連id都要自己作出來,
: 其實還是有點難度 @@
作者: criky (2501-2)   2016-12-22 21:33:00
非常感謝,可執行~不過我的資料階層有點亂,再想想怎麼整理
作者: cywhale (cywhale)   2016-12-22 22:31:00
LV只要123..12..這種跑法,上面應行得通,除非沒規則so
作者: criky (2501-2)   2016-12-23 22:32:00
研究了一下再回去看資料,發現我之前的例子說錯了 XD我再編輯自己的文章,謝謝cy大

Links booklink

Contact Us: admin [ a t ] ucptt.com