[問題] 階層資料整理

作者: criky (2501-2)   2016-12-23 23:57:18
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
新手(沒寫過程式,R 是我的第一次)
[問題敘述]:
我的階層資料如下,大概會有幾種情形:
以4層為例,從第4層obj=D1開始看:
lv obj dep
4 D1 C1 #Y
4 D1 C2 #Y
3 D1 B1
3 D1 B2
2 D1 A1
1 D1 A2
3 C1 B1 #Y
3 C2 B2 #Y
3 C2 B3 #Y
2 C1 B1
2 C2 B2
2 C2 A3
1 C1 B1
1 C2 B2
1 C2 A1
2 B1 A1 #Y
2 B1 A2 #Y
2 B2 A1 #Y
2 B3 A2 #Y
1 B1 A1
1 B1 A2
1 B2 A1
1 B3 A1
1 A1 #Y
1 A2 #Y
以D1為例,就去看LV MAX=4 的dep= C1, C2 ,LV=3,2,1 的data不管
C1, C2 的LV MAX=3 的dep=B1, B2, B3 ,LV=2,1 的data不管
B1,B2,B3 的LV MAX=2 的dep=A1, A2 , LV=1 的data不管
最後是 底層 LV=1 的A1, A2
我的想法是先group by obj, summaries LV MAX,
用迴圈方式作,先謝謝各位了~
我想要的是同樣的資料欄位,取 #Y的列即可,其它列不需要
早上試了一下,做了一種方式呈現階層,雖然不是我本來想要的,
不過還是貼上來看一下
dt1<-select(dt,lv1=lv,dep=obj,dep1=dep)
dt2<-select(dt,lv2=lv,dep1=obj,dep2=dep)
dt_maxlv<-dt %>%
group_by(obj) %>%
summarise(maxlv=max(lv))
dt_dep4<-left_join(dt_maxlv,dt,by=c("obj"="obj","maxlv"="lv")) %>%
left_join(dt1) %>%
group_by(obj,dep,dep1) %>% summarise(max(lv1)) %>%
left_join(dt2) %>%
group_by(obj,dep,dep1,dep2) %>% summarise(maxlv=max(lv2)) %>%
filter(maxlv==2)
dt_dep4
obj dep dep1 dep2 maxlv
<chr> <chr> <chr> <chr> <int>
1 D1 C1 B1 A1 2
2 D1 C1 B1 A2 2
3 D1 C2 B2 A1 2
4 D1 C2 B3 A2 2
以上四筆是正確的階層關係
下午終於試出來了,再full join回去,不過好像繞了一大圈 XD
dt.df<-data.frame(dt_dep4) %>%
full_join(.[,c(2,3)],by=c("obj"="dep","dep"="dep1")) %>%
full_join(.[,c(3,4)],by=c("obj"="dep1","dep"="dep2")) %>%
select(1,2) %>% na.exclude %>% distinct
dt.df
obj dep
1 D1 C1
2 D1 C2
3 C1 B1
4 C2 B2
5 C2 B3
6 B1 A1
7 B1 A2
8 B2 A1
9 B3 A2
[關鍵字]:
level
作者: Edster (Edster)   2016-12-24 09:30:00
最後要的形狀長怎樣? 看不懂你的文字。
作者: criky (2501-2)   2016-12-24 10:22:00
和本來的欄位相同,取我要的 #Y 那幾列

Links booklink

Contact Us: admin [ a t ] ucptt.com