问题描述
我想使用系统发育树的 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,tree$edge[2,paste(tree$edge[3,tree$edge[3,and so on until last row ....)
结果将是:
vector_names = 82_83,83_84,84_85,85_86,etc.
但是是一个有 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")
,
也许你可以像下面这样从fread
尝试data.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,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","85_86")
tree <- structure(c(82,83,84,85,86),.Dim = c(4L,2L))
,
最简单且计算效率最高的方法是
apply(tree3$edge,1,paste0,collapse = '_')