作者cywhale (cywhale)
看板R_Language
标题Re: [问题] 阶层资料列转栏
时间Thu Dec 22 12:38:09 2016
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都要自己作出来,
: 其实还是有点难度 @@
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.65.48
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1482381492.A.3F0.html
1F:推 criky: 非常感谢,可执行~不过我的资料阶层有点乱,再想想怎麽整理 12/22 21:33
2F:→ cywhale: LV只要123..12..这种跑法,上面应行得通,除非没规则so 12/22 22:31
3F:推 criky: 研究了一下再回去看资料,发现我之前的例子说错了 XD 12/23 22:32
4F:→ criky: 我再编辑自己的文章,谢谢cy大 12/23 22:33