[问题类型]:
程式咨询(我想用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