使用 tree$edge 行创建向量

Creating a vector using tree$edge rows

我想使用系统发育树的 tree$edge 行创建一个名称向量。我怎样才能构建这个载体? 示例:

tree$edge # object
     [,1] [,2]
  [1,]   82   83
  [2,]   83   84
  [3,]   84   85
  [4,]   85   86
  [5,]   86   87
  [6,]   87   88
  [7,]   88   89
  [8,]   89   90
  [9,]   90   91
 [10,]   91    1
 [11,]   91   92
 [12,]   92    2
 [13,]   92   93
 [14,]   93   94
 [15,]   94    3
 [16,]   94    4
 [17,]   93   95
 [18,]   95   96
 [19,]   96    5
 [20,]   96    6

我想创建一个向量(我称之为“vector_names”),每个元素都是 tree$edge 的行之一。 我可以逐行执行此操作:

vector_names = c(paste(tree$edge[1,1],tree$edge[1,2], sep = "_"), 
               paste(tree$edge[2,1],tree$edge[2,2], sep = "_"),
               paste(tree$edge[3,1],tree$edge[3,2], sep = "_"),
                and so on until last row ....)

结果将是:

vector_names = 82_83, 83_84, 84_85, 85_86, etc.

但是很长 table,有 161 行,我想知道是否有更快的方法来生成上面的 vector_names。

我们可以使用 strsplit 拆分 _ 然后 rbind list 个元素

do.call(rbind, lapply(strsplit(vector_names, "_"), as.numeric))

数据

vector_names <- c("82_83", "83_84", "84_85", "85_86")

也许你可以像下面这样从 data.table 尝试 fread

tree <- as.matrix(fread(text = paste0(paste0(vector_names, "\t")), sep = "_"))

read.table 来自基数 R

tree <- as.matrix(read.table(text = paste0(paste0(vector_names, "\t")), sep = "_"))

这给出了

     V1 V2
[1,] 82 83
[2,] 83 84
[3,] 84 85
[4,] 85 86

更新

如果你想从树中得到vector_names,你可以试试

> do.call(paste, c(data.frame(tree), sep = "-"))
[1] "82-83" "83-84" "84-85" "85-86"

数据

vector_names <- c("82_83", "83_84", "84_85", "85_86")

tree <- structure(c(82, 83, 84, 85, 83, 84, 85, 86), .Dim = c(4L, 2L))

最简单且计算效率最高的方法是 apply(tree3$edge, 1, paste0, collapse = '_')