1

我在从父/子分组对构建 tree.map 时遇到问题。这是我的示例数据:

SubjectID <- c('101','101','101','102','103','103','103')
parent <- c(1387, 1620, 1743,986,1623,1191,1450)
child <- c(1620,1743,1859 ,1015,1385,1450,1623)
df <- data.frame(SubjectID, parent,child)

我尝试使用以下方法构建树tree.map

df$pathString <- paste("study",df$SubjectID, df$parent, df$child, sep="/")
as.Node(df)

结果是:

1  study           
2   ¦--101         
3   ¦   ¦--1387    
4   ¦   ¦   °--1620
5   ¦   ¦--1620    
6   ¦   ¦   °--1743
7   ¦   °--1743    
8   ¦       °--1859
9   ¦--102         
10  ¦   °--986     
11  ¦       °--1015
12  °--103         
13      ¦--1623    
14      ¦   °--1385
15      ¦--1191    
16      ¦   °--1450
17      °--1450    
18          °--1623

我希望结果将父母与孩子联系起来,如下所示:

1  study           
2   ¦--101         
3   ¦   ¦--1387    
4   ¦   ¦   °--1620
5   ¦   ¦      °--1743
6   ¦   ¦         °--1859
9   ¦--102         
7   ¦   °--986     
8   ¦       °--1015
9   °--103         
10      ¦--1623    
11      ¦   °--1385
12      ¦--1191    
13      ¦   °--1450
14      ¦      °--1623
4

1 回答 1

0

打击代码工作并提供完全相同的输出。

library(data.tree)

SubjectID <- c('101','102','103','103')
parent <- c(1387, 986,1623,1191)
child1 <-c(1620,1015,1385,1450)
child2 <- c(1743,'','',1623)
child3 <- c(1859,'','','')
df<-data.frame(SubjectID, parent,child1,child2,child3)

df$pathString<- paste("study",df$SubjectID, df$parent, df$child1,df$child2,df$child3, sep="/") 

as.Node(df)

在此处输入图像描述

更新:基于您的评论的更新,包括数据转换。可能有更好的方法来转换数据。如果条件发生变化,可以相应地更新代码。

SubjectID <- c('101','101','101','102','103','103','103')
parent <-    c(1387,  1620, 1743, 986,  1623, 1191, 1450)
child<-      c(1620,  1743, 1859 ,1015, 1385, 1450, 1623)

nchild <- 10
nc <- 1
child_new <- rep(list(c()),nchild)
SID <- SubjectID[nc]
parentn <- parent[nc]
child_new[[nc]] <- child[nc]

for (s in 2:length(SubjectID)) {

  if (SubjectID[s]!=SubjectID[s-1]){
    nc <- 1
    SID <- c(SID,SubjectID[s])
    parentn <- c(parentn,parent[s])
    child_new[[1]] <- c(child_new[[1]],child[s])
    for (ic in 2:length(child_new))  child_new[[ic]] <- c(child_new[[ic]],"")
  } else {
    if(parent[s]==child[s-1]) {
      nc <- nc+1
      child_new[[nc]] <- c(child_new[[nc]],child[s])
    }
    if(parent[s]!=child[s-1]) {
      SID <- c(SID,SubjectID[s])
      parentn <- c(parentn,parent[s])
      child_new[[nc]] <- c(child_new[[nc]],child[s])
    }
  }
}

for (i in 1:length(child_new)){
  len_child <- length(child_new[[i]])
  if (len_child<length(SID)) child_new[[i]] <- c(child_new[[i]],rep("",length(SID)-len_child)) 
}

library(data.tree)
df <- data.frame(t(matrix(unlist(child_new), nrow=nchild, byrow=T)))
df <- cbind(SID, parentn, df)
df$pathString<- paste("study",do.call(paste, c(df[colnames(df)], sep="/")),sep="/") 

as.Node(df)
于 2019-05-30T05:48:27.030 回答