Коды удара работают и дают точно такой же вывод.
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)