0

我想使用系统发育树的 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.

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

4

3 回答 3

1

我们可以使用to strsplitsplit by_然后元素rbindlist

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

数据

vector_names <- c("82_83", "83_84", "84_85", "85_86")
于 2021-01-13T20:53:56.337 回答
1

也许你可以freaddata.table下面尝试

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))
于 2021-01-13T21:28:26.200 回答
0

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

于 2021-01-31T20:00:54.250 回答