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都要自己作出来,
: 其实还是有点难度 @@