我确实有一个大约有80个条目的列,它只有22个不同的级别(染色体的数量)。在 R 中是否有任何快速技巧可以找出一个水平变为下一个位置的位置...以便弄清楚哪一行染色体1变为染色体2(单个染色体的所有条目都是列在一起)?
我的数据如下:
chr number marker name (SNP)
1 rs...
1 rs...
.
.
2
感谢
答案 0 :(得分: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
答案 1 :(得分:1)
您可以使用unique
R:
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
匹配在它的第二个参数中返回它的第一个参数的第一个匹配位置的向量。这是有效的,因为染色体的所有条目都列在一起。
答案 2 :(得分: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