-1

我确实有一列有大约 80k 个条目,它只有 22 个不同的级别(染色体的数量)。R中是否有任何快速技巧可以找出一个级别在哪个位置变为下一个......以便找出第1号染色体在哪一行变为第2号染色体(单个染色体的所有条目都列在一起)?

我的数据如下所示:

chr number  marker name (SNP) 
1              rs...
1              rs...
.
.
2

谢谢

4

3 回答 3

1

检查是否为diff非零。这将返回一个逻辑向量,TRUE当连续值不同时。将其包裹起来which以获取数字索引。

(x <- factor(sample(c("a", "b"), 15, replace = TRUE)))
# [1] a a b b a a b b b b b a b a a
# Levels: a b
diff(as.integer(x)) != 0
# [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
which(diff(as.integer(x)) != 0)
# [1]  2  4  6 11 12 13

如果您的所有染色体值都组合在一起,您可以使用 找到每个级别的第一个实例duplicated

(x2 <- factor(rep(c("a", "b", "c"), times = c(3, 4, 6))))
# [1] a a a b b b b c c c c c c
# Levels: a b c
!duplicated(x2)
# [1]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
which(!duplicated(x2))
# [1] 1 4 8
于 2013-04-11T10:20:07.793 回答
1

您可以从R中使用unique和:matchbase

data <- c(rep("a",10),rep("b",5),rep("c",2),rep("d",10))
match( unique(data) , data )
#[1]  1 11 16 18

Match 返回其第一个参数的第一个匹配项在其第二个参数中的位置的向量。之所以有效,是因为您的所有染色体条目都列在了一起。

于 2013-04-11T10:23:52.277 回答
0

您可以rle为此使用(如果我的问题正确):

x <- rep(LETTERS[1:22], each = 3)
x
# [1] "A" "A" "A" "B" "B" "B" "C" "C" "C" "D" "D" "D" "E" "E" "E" "F" "F" "F" "G" "G" "G" "H" "H" "H" #"I" "I" "I" "J" "J" "J" "K" "K" "K" "L" "L" "L" "M" "M" "M" "N" "N" "N" "O" "O" "O" "P" "P" "P" #"Q" "Q" "Q" "R" "R" "R" "S" "S" "S" "T" "T" "T" "U" "U" "U" "V" "V" "V"
rles <- rle(x)
cumsum(rles$lengths)
# [1]  3  6  9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66
于 2013-04-11T10:16:59.520 回答