2017-05-05 20 views
1

我在R A分类数据帧如下:创建并从数据帧中的R打印产品层次树无“NA”与data.tree

Cat_0 Cat_1 Cat_2 Cat_3 Cat_4 
Baby Travel Bath Towels Age 0-1 
Baby Travel Bath Towels Age 1-2 
Baby Travel Box  NA  NA 
Baby Chairs Sit  NA  NA 
Animals Horse Rider Safety Chaps 
Animals Horse Rider Caps  NA 
Animals pig  NA  NA  NA 

欲与该数据定义了树.tree包,供将来计算,树应该像这样。

     |----Chairs----sit 
      |   |          |---age 0-1 
      |---- Baby---|    |----Bath----Towels----| 
      |   |----Travel----|      |---age 1-2 
      |       |----Box 
Product --| 
      |        |---safety----chaps 
      |   |---Horse---rider---| 
      |-- Animals--|     |---caps 
      |   |---Pig 

我可以像上面那样创建树,但有NA出现,我想删除NA中的data.tree。这是我的代码:

tree$pathString <- paste("product", 
         tree$Cat_0, 
         tree$Cat_1, 
         tree$Cat_2, 
         tree$Cat_3, 
         tree$Cat_4, 
         sep = "/") 

tree <- as.Node(tree) 
print(tree) 
+0

您可以使用例如paste5从这个答案:http://stackoverflow.com/questions/13673894/suppress-nas-in-paste –

回答

1

使用data.tree包:

library(data.tree) 

包的作者提供的答案,你必须使用所提供的替代paste5功能省略NA的粘贴时下面的计算器答案:

suppress NAs in paste()

paste5 <- function(..., sep = " ", collapse = NULL, na.rm = F) { 
    if (na.rm == F) 
    paste(..., sep = sep, collapse = collapse) 
    else 
    if (na.rm == T) { 
     paste.na <- function(x, sep) { 
     x <- gsub("^\\s+|\\s+$", "", x) 
     ret <- paste(na.omit(x), collapse = sep) 
     is.na(ret) <- ret == "" 
     return(ret) 
     } 
     df <- data.frame(..., stringsAsFactors = F) 
     ret <- apply(df, 1, FUN = function(x) paste.na(x, sep)) 

     if (is.null(collapse)) 
     ret 
     else { 
     paste.na(ret, sep = collapse) 
     } 
    } 
} 

Then

tree$pathString <- paste5("product", 
          tree$Cat_0, 
          tree$Cat_1, 
          tree$Cat_2, 
          tree$Cat_3, 
          tree$Cat_4, 
          sep = "/", 
          na.rm = TRUE)  

htree <- as.Node(tree, na.rm=TRUE) 
print(htree) 
+0

当我使用这种方法(如我以前所做的),我仍然在我的结构。 – user5424264

+0

您需要使用na.rm = T –

+0

来调用paste5非常感谢! – user5424264