[问题] 阶层资料列转栏

楼主: criky (2501-2)   2016-12-20 08:14:51
[问题类型]:
程式咨询(我想用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都要自己作出来,
其实还是有点难度 @@
感谢cy大提供解法如下:
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")
正是我要的结果!
不过我再回去看资料发现我举例有误 XD
我的资料及修改cy大的程式码如下:
dt <- fread('LV Obj Dep
0 A1 ""
1 B1 A1
0 A1 ""
1 B2 A1
2 C1 B2
0 A1 ""
1 B2 A1
2 C2 B2
3 D1 C2')
#0阶是底层
dt[,stx:=ifelse(LV<1,"Dep0",paste0("Dep",LV)),by=.(LV)] %>%
#加入stx栏,底层命名为Dep0,其它为Dep+LV
.[,nL:=as.integer(stx=="Dep0")] %>%
#加入nL栏,stx==Dep0为1,其它为0
.[,ngp:=cumsum(nL)]
#加入ngp栏==nL累积次数
x1 <- dcast(dt, ngp ~ stx, value.var = "Obj")
x1
ngp Dep0 Dep1 Dep2 Dep3
1: 1 A1 B1 NA NA
2: 2 A1 B2 C1 NA
3: 3 A1 B2 C2 D1
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 27.147.47.152
※ 文章网址: https://www.ptt.cc/bbs/R_Language/M.1482192894.A.068.html
作者: abc2090614 (casperxdd)   2016-12-20 09:34:00
这等于是有个tree的edges + depths 然后作 root toleaf tree traversal?...我其实也满好奇这在r要怎作
作者: clansoda (小笨)   2016-12-20 09:55:00
认真的说 楼上的大大真是厉害 我看不懂怎么从图一变图二的 本来想解 结果看不懂XD
作者: cywhale (cywhale)   2016-12-22 00:47:00
你的意思是id是自己手动加的?所以要能自动产生?..
楼主: criky (2501-2)   2016-12-22 07:26:00
yes 我刚po文时是没有id的,资料也没有id,只有阶层关系

Links booklink

Contact Us: admin [ a t ] ucptt.com