我确实有一列有大约 80k 个条目,它只有 22 个不同的级别(染色体的数量)。R中是否有任何快速技巧可以找出一个级别在哪个位置变为下一个......以便找出第1号染色体在哪一行变为第2号染色体(单个染色体的所有条目都列在一起)?
我的数据如下所示:
chr number marker name (SNP)
1 rs...
1 rs...
.
.
2
谢谢
我确实有一列有大约 80k 个条目,它只有 22 个不同的级别(染色体的数量)。R中是否有任何快速技巧可以找出一个级别在哪个位置变为下一个......以便找出第1号染色体在哪一行变为第2号染色体(单个染色体的所有条目都列在一起)?
我的数据如下所示:
chr number marker name (SNP)
1 rs...
1 rs...
.
.
2
谢谢
检查是否为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
您可以从R中使用unique
和:match
base
data <- c(rep("a",10),rep("b",5),rep("c",2),rep("d",10))
match( unique(data) , data )
#[1] 1 11 16 18
Match 返回其第一个参数的第一个匹配项在其第二个参数中的位置的向量。之所以有效,是因为您的所有染色体条目都列在了一起。
您可以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